1. spring proxy的内建过程:
- <aop:aspectj-autoproxy>标签实际上生成Bean:
org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator
- spring Bean加载器装入bean声明
- 在bean声明中查询是否有代理生成类,放入advisor列表
- 加载实体类
- 在advisor列表中查询符合该实体类的advisor
- 生成代理类(如果有符合的advisor列表)
- 完成类加载
2. proxy代理类型:
- Jdk proxy模式,如果在spring的aop默认模式下,如果类有接口声明,则是这种模式
- CBLib动态生成类模式,如果类没有接口声明
- LTW(loading time weaver)加载时代码编织,这个在java中默认是不支持的,实际上是使用了java agent 方式,使用第三方对底层jvm加载进行了处理
3. <aop:aspectj-autoproxy>
aspect 自动代理模式,含义是自动将含有@Aspect注解的Bean(是Bean!)作为Advisor加入aop:config中。
要点:
- 如果没有约束,就是所有的bean都会查看是否含有@Aspect
- <aop:include>中name一定是Pattern表达式,不是spring execution表达式
- 对于pointcut,声明在该类中@Pointcut上
- 对于类型,声明在该类对应的处理函数上
4. <aop:config>
- 实际上和auto-proxy一样,只是auto-proxy的config内容是写在注解里面的,直接对应于aop:config的config内容,配置内容基本一样,标签对应注解
5. 注意:
- spring配置bean时lazy-init选项在abstract上的声明不能在继承该bean的bean上生效。