springAOP一

springAOP一

本篇需要解决的问题
  1. 介绍aspectj和aop关系
  2. spring aop 中aspect,advice,advisor分别是什么意义
  3. 介绍aop有几种实现方式
  4. 简单介绍aop的的底层原理
spring-aop源码目录
  1. aop,aspectj,springaop的历史
    1. spring1.2中配置
    2. spring 2.0 @aspectJ配置
    3. spring 2.0 schema-based配置
    4. aspectJ编译方式实现aop
  2. spring aop源码解析
    1. 切面类的解析
    2. 创建代理
    3. 代理类的调用
正文
  1. aop,aspectj,springAop的历史

    1. aop是实现在我们在我们原来代码基础上进行一定包装,比如方法执行前,返回后,抛出异常后等地方进行一定的拦截处理,增强处理
    2. aop实现是通过 spring把在方法的几个生命周期告之,而我们要实现一个代理,实际运行的实例是生成的代理类的实例
  2. aspectj和 aop对比如下

    1. 1650437241674

    2. 1650437361222

    3. spring aop

    4. 它基于动态代理来实现,默认的如果使用接口,用jdk提供的动态代理实现

    5. spring3.2后,spring-core把cglib和asm的源码包括进来,所以不需要显示引入依赖

    6. spring的aop 依赖于 ioc容器进行管理

    7. spring提供了aspectJ的支持,但只能用到aspectj的切点解析和匹配

    8. 性能方面,spring aop基于代理,在容器启动时需要生成代理实例,在方法调用上增加了栈的深度,性能上没有aspectJ好

    9. aspectj

    10. 出自 eclipse 基金会

    11. 静态织入,通过修改代码实现,织入的时机可以是编译期,可以是编译后,也可以是加载类的时候(比如自定义加载器,或者被织入类加载到jvm前加载,或者在jvm启动时指定aspectJ agent:-javaagent:xxx/xxx/aspectjweaver.jar )

    12. aspectj在实际代码运行前 完成了织入,所以他生成的类是没有额外运行时开销的

  3. spring aop

    1. spring aop 沿用了aspectJ中的盖面,但是不依赖其功能实现 ,比如 aspect pointcut before after是spirng自己实现的

    2. spring配置aop的三种方式

      1. 基于接口
      2. 基于xml
      3. 基于@AspectJ
    3. spring aop 源码解析

      1. spring aop 是通过动态代理实现的,通过一个切面类,在他的类上假如@Aspect注解,定义一个pointcut方法,定义增强方法,就完成了一个对象的切面操作

      2. 所涉及的一些类操作,

        1. 找到所有的切面类
        2. 解析出所有的advice
        3. 常见动态代理类
        4. 调用被代理的方法,找到他所有的增强器,增强方法
        5. 1650443848681
      3. 切面类的解析

        1. spring通过@EnableAspectJAntoproxy开启aop切面,在注解类上@Import(AspectJAutoProxyRegistrar.class),他实现了ImportBeanDefinitionRegistrar,所以他会通过registerBeanDefinitions为我们容器导入beanDefinition.

        2. 1650444715268

        3. 1650444723277

        4. 看源码,追踪入口AnnotationAwareAspectJAutoProxyCreator

        5. 1650446074772

        6. 我们看一下他的类继承关系图,发现它实现了两个重要

          的接口,BeanPostProcessor和InstantiationAwareBeanPostProcessor ,看instantiationAwareBeanpostprocessor的postProcessorBeforeInstantiation

          Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)(InstantiationAwareBeanPostProcessor)

          org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation

          org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator#shouldSkip

          org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors

          org.springframework.aop.aspectj.annotation.BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors

          1650447282999

          1650447309459

          1650447321308

          16504473335001650448046276

          1650448067137

          1650448094496

          1650448141957

          1650448159053

          1650448188883

          1650448208277

          1650448247278

          1650448266287

          1650448286710

          1650448301316

          1650448349217

          1650448375635

          1650448387082

posted @ 2022-04-20 17:58  小傻孩丶儿  阅读(34)  评论(0编辑  收藏  举报