Spring-AOP

2019-08-29  本文已影响0人  begonia_rich

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即可

上一篇 下一篇

猜你喜欢

热点阅读