美文网首页
Spring-AOP

Spring-AOP

作者: begonia_rich | 来源:发表于2019-08-29 01:59 被阅读0次

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

相关文章

  • 自定义注解,aop+redis,实现controller接口频率

    1,环境配置 引入aop的jar包compile 'org.springframework:spring-aop:...

  • spring-4.3.4.RELEASE集成AOP 实战

    一、依赖引入 (包括 spring-aop 以及 aspectj) 二、切面配置代码 (使用 javaConfig...

  • spring-AOP

    Aspects,切面 spring-aop 是spring-aspects的上层建筑 targetClass Me...

  • spring-aop

    aop概念aop概念aop术语AOP实现方式1、spring-aop(使用xml文件实现AOP)2、AspectJ...

  • spring-aop

    Aop-面向切面编程,在程序中主要用来解决一些系统层面上的问题,比如:日志,事务,权限等。 aop的一些基本概念:...

  • spring-aop

    1, aop的两种实现机制动态代理:利用jdk/cglib动态代理,性能弱一丢丢 jdk动态代理:所有的方法调用被...

  • spring-aop

  • Spring-AOP

    AOP的概念 面向切面的编程,切面用于描述分散在对象、类或者函数中的横向关注点,通过分离这些关注点,把解决特定领域...

  • spring-aop

    aop概念 aop术语 joinpoint连接点:类中可以被增强的方法(其实就是类中的方法) pointcut切入...

  • spring-aop

    aop 概念:面向切面编程作用:不用修改原来的类就可以添加新功能 专业术语 joinpoint 连接点:类中可以被...

网友评论

      本文标题:Spring-AOP

      本文链接:https://www.haomeiwen.com/subject/egfbectx.html