天天看点

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
  1. spring aop源码解析
  1. 切面类的解析
  2. 创建代理
  3. 代理类的调用
正文
  1. aop,aspectj,springAop的历史
  1. aop是实现在我们在我们原来代码基础上进行一定包装,比如方法执行前,返回后,抛出异常后等地方进行一定的拦截处理,增强处理
  2. aop实现是通过 spring把在方法的几个生命周期告之,而我们要实现一个代理,实际运行的实例是生成的代理类的实例
  1. aspectj和 aop对比如下
  1. springAOP一
  2. springAOP一
  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在实际代码运行前 完成了织入,所以他生成的类是没有额外运行时开销的
  1. spring aop
  1. spring aop 沿用了aspectJ中的盖面,但是不依赖其功能实现 ,比如 aspect pointcut before after是spirng自己实现的
  2. spring配置aop的三种方式
  1. 基于接口
  2. 基于xml
  3. 基于@AspectJ
  1. spring aop 源码解析
  1. spring aop 是通过动态代理实现的,通过一个切面类,在他的类上假如@Aspect注解,定义一个pointcut方法,定义增强方法,就完成了一个对象的切面操作
  2. 所涉及的一些类操作,
  1. 找到所有的切面类
  2. 解析出所有的advice
  3. 常见动态代理类
  4. 调用被代理的方法,找到他所有的增强器,增强方法
  5. springAOP一
  1. 切面类的解析
  1. spring通过@EnableAspectJAntoproxy开启aop切面,在注解类上@Import(AspectJAutoProxyRegistrar.class),他实现了ImportBeanDefinitionRegistrar,所以他会通过registerBeanDefinitions为我们容器导入beanDefinition.
  2. springAOP一
  3. springAOP一
  4. 看源码,追踪入口AnnotationAwareAspectJAutoProxyCreator
  5. springAOP一
  6. 我们看一下他的类继承关系图,发现它实现了两个重要

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

    springAOP一

    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

    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一
    springAOP一

不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!