3、AOP及源码分析
if( 你有spring源码基础 ){
请继续;
}else{
请放弃;
}
开启AOP
常用注解
@EnableAspectJAutoProxy
通过@EnableAspectJAutoProxy注解开启AOP功能
@Aspect 代表切面类,定义通知和切面
- @Before
- @After
- @Around:注意使用Around时,其他消息会失效
- @AfterThrowing
- @AfterRetruning
- @Pointcut :公共切入点
调用消息时,如要获取切入点(被增强方法)的参数等信息,
在消息方法加入 JoinPoint 参数:
@Before(value = "cn.danaohu.aspect.CarProxy.gongGong()")
public void test1(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
System.out.println("args = " + args);
}
@EnableAspectJAutoProxy注解
打开spring源码,进入EnableAspectJAutoProxy类,发现有@Import这个元注解,意思是注册一个或者多个bean来完成注解的功能。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
……
AspectJAutoProxyRegistrar 提供beanDefinition信息用于注册bean。来处理AOP
具体被注册的beanDefinition为:AnnotationAwareAspectJAutoProxyCreator
翻译为:注解装配模式的Aspect切面自动代理创建器,属于一个后置处理器,并能获取BeanFactory
代码如下:
//这个类的继承关系如下
Object (java.lang)
ProxyConfig (org.springframework.aop.framework)
ProxyProcessorSupport (org.springframework.aop.framework)
AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
AbstractAdvisorAutoProxyCreator (org.springframework.aop.framework.autoproxy)
AspectJAwareAdvisorAutoProxyCreator (org.springframework.aop.aspectj.autoproxy)
AnnotationAwareAspectJAutoProxyCreator (org.springframework.aop.aspectj.annotation)
//其中AbstractAutoProxyCreator代码如下
//说明这个bean将被注册为一个后置处理器,用来进行aop操作,并能够获取BeanFactory
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
...
//其中在初始化AnnotationAwareAspectJAutoProxyCreator这个bean的时候,会判断type是否
//属于BeanFactoryAware,是的话会调用其setBeanFactory,将spring容器注入其中,代码如下
private void invokeAwareMethods(String beanName, Object bean) {
...
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
...
spring 中 AOP 始化过程
beanPostProcessor bean 也是bean ,初始化过程基本一致
1、传入配置类,创建是spring ioc容器
2、注册配置类,调用refresh,初始化单例bean
3、在refresh方法中,调用registerBeanPostProcessors,用于初始化后置处理器
- 获取容器中所有需要创建的BeanPostProcessors的Defintion信息
- AOP的definition信息由配置类的@EnableAspectAutoPorxy注解来注册
- 定义BeanPostProcessor的优先级用于区分
- 优先注册实现了PriorityOrderd接口的BeanPostProcessor
- 其次注册实现了Orderd接口的BeanPostProcessor(AOP的BeanPostPorcessor实现了该接口)
- 最后注册普通的BeanPostProcessor
- 注册AnnotationAwareAspectJAutoProxyCreator到容器(Bean)(beanDefinition.beanName=internalAutoProxyCreator)
- 创建bean对象
- populateBean:给bean的属性赋值
- initializeBean:初始化bean
- invokeAwareMethods() 为相对应的Aware接口调用set方法赋值
- applyBeanPostProcessorsBeforeInitalization() 应用后置处理器的初始化前处理方法
- invokeInitMethods() 执行自定义的初始化方法
- applyBeanPostProcessorsAfterInitalization() 应用后置处理器的初始化后处理方法
- AnnotationAwareAspectJAutoProxyCreator bean 创建成功
4、将初始化好的后置处理器添加到spring容器(一级缓存、单例池)
spring 处理 AOP
未完待续
spring 声明式事务
准备工作
- 开启@EnableTransactionManagement注解
- 注册连接池
- 注册TransactionManagement事务管理器(执行事务的回滚提交等操作)
- serverice 上开启@Transaction注解
浙公网安备 33010602011771号