springAOP一
springAOP一
本篇需要解决的问题
- 介绍aspectj和aop关系
- spring aop 中aspect,advice,advisor分别是什么意义
- 介绍aop有几种实现方式
- 简单介绍aop的的底层原理
spring-aop源码目录
- aop,aspectj,springaop的历史
- spring1.2中配置
- spring 2.0 @aspectJ配置
- spring 2.0 schema-based配置
- aspectJ编译方式实现aop
- spring aop源码解析
- 切面类的解析
- 创建代理
- 代理类的调用
正文
-
aop,aspectj,springAop的历史
- aop是实现在我们在我们原来代码基础上进行一定包装,比如方法执行前,返回后,抛出异常后等地方进行一定的拦截处理,增强处理
- aop实现是通过 spring把在方法的几个生命周期告之,而我们要实现一个代理,实际运行的实例是生成的代理类的实例
-
aspectj和 aop对比如下
-
spring aop
-
它基于动态代理来实现,默认的如果使用接口,用jdk提供的动态代理实现
-
spring3.2后,spring-core把cglib和asm的源码包括进来,所以不需要显示引入依赖
-
spring的aop 依赖于 ioc容器进行管理
-
spring提供了aspectJ的支持,但只能用到aspectj的切点解析和匹配
-
性能方面,spring aop基于代理,在容器启动时需要生成代理实例,在方法调用上增加了栈的深度,性能上没有aspectJ好
-
aspectj
-
出自 eclipse 基金会
-
静态织入,通过修改代码实现,织入的时机可以是编译期,可以是编译后,也可以是加载类的时候(比如自定义加载器,或者被织入类加载到jvm前加载,或者在jvm启动时指定aspectJ agent:-javaagent:xxx/xxx/aspectjweaver.jar )
-
aspectj在实际代码运行前 完成了织入,所以他生成的类是没有额外运行时开销的
-
spring aop
-
spring aop 沿用了aspectJ中的盖面,但是不依赖其功能实现 ,比如 aspect pointcut before after是spirng自己实现的
-
spring配置aop的三种方式
- 基于接口
- 基于xml
- 基于@AspectJ
-
spring aop 源码解析
-
spring aop 是通过动态代理实现的,通过一个切面类,在他的类上假如@Aspect注解,定义一个pointcut方法,定义增强方法,就完成了一个对象的切面操作
-
所涉及的一些类操作,
- 找到所有的切面类
- 解析出所有的advice
- 常见动态代理类
- 调用被代理的方法,找到他所有的增强器,增强方法
-
切面类的解析
-
spring通过@EnableAspectJAntoproxy开启aop切面,在注解类上@Import(AspectJAutoProxyRegistrar.class),他实现了ImportBeanDefinitionRegistrar,所以他会通过registerBeanDefinitions为我们容器导入beanDefinition.
-
看源码,追踪入口AnnotationAwareAspectJAutoProxyCreator
-
我们看一下他的类继承关系图,发现它实现了两个重要
的接口,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
-
-
-