spring-aop模块笔记
核心接口与概念
Pointcut切点:切点就是所有的待匹配的切入点,被它过滤通过的类或方法才会生成对应的Advice(注意可以多个切点匹配多个Advice最后生成一个代理对象)
Advice:可以看做MethodInterceptor.用来标记通知接口.有前置通知,环绕通知,后置通知,异常通知等
Advisor:增强器.对Advice的增强/适配,包含切点内容,连接点上下文存放,参数匹配,过滤器链的源数据,增强器是产生代理的核心解析对象
Joinpoint连接点:连接点可以看做是接入点上下文封装(就是通知的入参,方法,对象)
核心点:通知,切点,增强器(通知+切点,拦截器实现部分就是增强器列表)
整体流程
生成入口核心基类在AbstractAutoProxyCreator中它是一个BeanPostProcessor,注解实现是子类AnnotationAwareAspectJAutoProxyCreator支持的,它从容器获取@Aspect注解的类,将@Before,@Around这样的通知注解的方法转为Advisor(如:InstantiationModelAwarePointcutAdvisorImpl)切点的表达式判断委托实现到AspectJExpressionPointcut类.然后进行匹配,过滤.将符合表达式的进行返回,产生对应的Jdk或Cglib代理返回,在调用中动态的将Advisor数组经过适配器转换为Interceptor数组最后生成过滤器链进行调用.
看代码时把握AopProxyFactory-AopProxy-Proxy三层结构主线
核心接口与实现类
Advised接口:AOP工厂顶层配置类接口
ProxyFactory:核心代理配置工厂.可以设置Advisor
AbstractAutoProxyCreator:Spring适配部分核心基类,产生代理的主流程在这里开启
AnnotationAwareAspectJAutoProxyCreator:AspectJ元素的获取与适配转换
ReflectiveMethodInvocation:通知链的实现部分
AspectJExpressionPointcut-AspectJ支持的切点表达式实现
ReflectiveAspectJAdvisorFactory-AspectJ注解转换为Spring AOP规范
JdkDynamicAopProxy:Jdk代理的入口
AOP接入使用
参考MethodValidationPostProcessor这个类的aop接入
生成指定注解的切点,随后接入方法验证拦截器,这样对类先过滤,通过的再接拦截器,比较典型的aop接入方式
代码示例
public void afterPropertiesSet() {
Pointcut pointcut = new AnnotationMatchingPointcut(this.validatedAnnotationType, true);
this.advisor = new DefaultPointcutAdvisor(pointcut, createMethodValidationAdvice(this.validator));
}
protected Advice createMethodValidationAdvice(@Nullable Validator validator) {
return (validator != null ? new MethodValidationInterceptor(validator) : new MethodValidationInterceptor());
}
手工AOP编程
使用ProxyFactory可以进行配置aop的Advice/拦截器/Advisor进而直接产生代理对象,编程式aop的入口就在这个配置类,这个类还是挺重要的
举个例子:
@Test
public void testInterceptorWithoutJoinpoint() {
final TestBean target = new TestBean("tb");
ITestBean proxy = ProxyFactory.getProxy(ITestBean.class, (MethodInterceptor) invocation -> {
assertNull(invocation.getThis());
return invocation.getMethod().invoke(target, invocation.getArguments());
});
assertEquals("tb", proxy.getName());
}
注意ProxyFactory这个类
pf.addAdvisor(advisor);
可以手动的添加增强器并生成代理,这个方式在Spring内部被大量使用,并且提供了很多功能性的Pointcut,Advisor方便使用,我们一般创建AOP代理对象都是通过ProxyFactory来创建的,只需要进行配置ProxyFactory即可
网友评论