摘要:注意前一节我们的代理是对对象进行了代理,而的可以基于方法进行代理,因为类的属性和方法都有相应的类来描述或者对应属性由的表示,方法由来表示这里说几个的接口或类切入点用来说明是对哪些类的哪些方法进行横切就是被代理的对象的一个集合说明对哪些类进行
注意: 前一节我们的代理是对对象进行了代理,而spring 的AOP 可以基于方法进行代理,因为类的属性和方法都有相应的类来描述或者对应 属性由java的Field 表示,方法由Method 来表示
这里说几个spring AOP 的接口或类
1 切入点org.springframework.aop.Pointcut用来说明是对哪些类的哪些方法进行横切,就是被代理的对象的一个集合
public interface Pointcut{ //说明对哪些类进行横切 ClassFilter getClassFilter(); //用来说明对哪些方法进行横切 MethodMatcher getMethodMatcher(); Pointcut TRUE = TruePointcut.INSTANCE; }2 连接点
org.springframework.aop.JoinPoint 当程序运行时,对某一个具体的要被横切的方法的描述,通过它可以获取被横切,也就是被代理的那个方法的运行时的状态,例如,被代理的方法的参数,所属对象,所属对象签名,代理对象。
public interface JoinPoint { //... //获取所属对象 Object getTarget(); //获取被代理的方法的参数 Object[] getArgs(); //获取连接点的签名 Signature getSignature(); //描述位置,哪一行 SourceLocation getSourceLocation(); //... }3 通知
MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice, Advice是对
附加方法(被代理的方法前后需要执行的)的描述
3.1
public interface MethodBeforeAdvice extends BeforeAdvice { void before(Method method, Object[] args, Object target) throws Throwable; }
方法说明:before方法有三个参数 被增强的方法,参数,被横切的对象从理论上来说在before的方法内部可以执行 method.invoke(target,args) 来执行被增强的方法,但是我们一般不会这么做,我们会用这三个参数来动态获取一些信息,或其它功能,但不是去执行被增强的方法,也就是说BeforeAdvice没有代理的职责。
接口说明:BeforeAdvice继承Advice,BeforeAdvice 和 Advice都是标识接口 没有方法,没有属性
参数说明:method 具体的一个连接点 args 连接点的参数 target 连接点所属的对象
3.2
public interface AfterReturningAdvice extends AfterAdvice { void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable; }
这里同样没有代理的职责
接口说明:AfterAdvice继承Advice,都是标识接口 没有方法,没有属性
参数说明:returnValue被代理的方法的返回值的描述 method 具体的一个连接点 args 连接点的参数 target 连接点所属的对象
3.3
public interface ThrowsAdvice extends AfterAdvice { }
public void afterThrowing(Exception ex)
public void afterThrowing(RemoteException)
public void afterThrowing(Method method, Object[] args, Object target, Exception ex)
public void afterThrowing(Method method, Object[] args, Object target, ServletException ex)
说明:ThrowsAdvice没有方法,没有属性,但是实现这个接口的类必须有 afterThrowing 方法
4 拦截器MethodInterceptor方法拦截器, 继承了Interceptor接口,Interceptor接口又继承了Advice接口,Interceptor和Advice都是标识接口没有属性和方法
public interface MethodInterceptor extends Interceptor { Object invoke(MethodInvocation invocation) throws Throwable; }
这里的invoke方法有代理的责任,也就是说在invoke方法内部会调用代理的那个方法,也就是去执行连接点
MethodInvocation继承了Invocation接口,Invocation接口继承了Joinpoint接口,注意这里是Joinpoint,是java语言的java.lang.reflect.AccessibleObject.Pointcut而Joinpoint接口内部有 Object proceed() throws Throwable这样一个方法,调用这个方法会执行JoinPoint描述的那个被代理的方法。
Advisor是Pointcut和Advice的配置器,将 某个具体的 Advice 注入到 Pointcut所指定的位置
public interface Advisor { Advice getAdvice(); boolean isPerInstance(); } public class DefaultPointcutAdvisor extends AbstractGenericPointcutAdvisor implements Serializable { private Pointcut pointcut = Pointcut.TRUE; //... public DefaultPointcutAdvisor(Pointcut pointcut, Advice advice) { this.pointcut = pointcut; setAdvice(advice); } //... } public abstract class AbstractGenericPointcutAdvisor extends AbstractPointcutAdvisor { private Advice advice; /** * Specify the advice that this advisor should apply. */ public void setAdvice(Advice advice) { this.advice = advice; } @Override public Advice getAdvice() { return this.advice; } }
从上面我们可以看到DefaultPointcutAdvisor需要持有一个Advice的对象一个Pointcut的对象我们在使用的时候只需要为它提供这两个对象他就会去自己进行配置
6 代理工厂ProxyFactoryBean, 创建代理对指定的某个类的对象进行代理,或者对符合规则的一堆类进行代理使用时只需进行配置。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65153.html
摘要:是什么是面向切面编程的简称。负责实施切面,它将切面所定义的横切逻辑织入到切面所指定的连接点钟。静态正则表达式匹配切面是正则表达式方法匹配的切面实现类。流程切面的流程切面由和实现。 aop是什么 aop是面向切面编程(aspect oriented programing)的简称。aop的出现并不是要完全替代oop,仅是作为oop的有益补充。aop的应用场合是有限的,一般只适合于那些具有横...
摘要:了解的相关术语通知通知定义了切面是什么,以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。就是用来配置切面设置代理模式。 了解AOP的相关术语 1.通知(Advice): 通知定义了切面是什么,以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。 2.连接点(Joinpoint): 程序能够应用通知的一个时机,这些时机就是连接点,例如方法被调用时、异常被抛出时等等。 ...
摘要:表示少女与紧耦合在它的构造函数中自行创建了。面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术系统由许多不同的组件组成,每个组件各负责一特定的功能。我们可以把切面想象为覆盖在很多组件之上的一个外壳。 第1章 Spring之旅 说明 1、本文抄写了《Spring 实战》重点内容,参考了GitHub上的代码 2、每个人的学习方式不一样,但目的是一样的,活学活用。最近一直在听《我...
摘要:自定义注解不生效原因解析及解决方法背景项目中,自己基于实现了一套缓存注解。但是最近出现一种情况缓存竟然没有生效,大量请求被击穿到层,导致压力过大。至此,问题得到解决。 自定义注解不生效原因解析及解决方法 背景: 项目中,自己基于spring AOP实现了一套java缓存注解。但是最近出现一种情况:缓存竟然没有生效,大量请求被击穿到db层,导致db压力过大。现在我们看一下具体代码情形(代...
摘要:的面向的异常遵从通用的异常层次结构。比如以前常用的框架,现在常用的框架包含许多项目,下面挑一些最常用的出来总结一下。状态是流程中事件发生的地点,在流程中通过转移的方式从一个状态到另一个状态,流程的当前状况称为流程数据。 如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,我就在这里总结一下,理顺头绪...
阅读 3029·2021-10-12 10:12
阅读 5244·2021-09-26 10:20
阅读 1474·2021-07-26 23:38
阅读 2793·2019-08-30 15:54
阅读 1623·2019-08-30 13:45
阅读 1938·2019-08-30 11:23
阅读 3055·2019-08-29 13:49
阅读 795·2019-08-26 18:23