Spring-AOP源码分析

一,要想启用AOP,我们主要要用到注解@EnableAspectJAutoProxy(启用AOP),而我们的分析将从该注解开始,该注解的定义如下:

我们可以看到@EnableAspectJAutoProxy上有一个@Import注解,@Import注解注册了BeanAspectJAutoProxyRegistrar,我们进入AspectJAutoProxyRegistrar,该类实现了ImportBeanDefinitionRegistrar(该类主要是用来注册bean),以上的Bean仅仅只是注册BeanDefinition,还未初始化

看实现方法:AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

主要是注册bean:

beanName=org.springframework.aop.config.internalAutoProxyCreator

bean=AnnotationAwareAspectJAutoProxyCreator

二:我们开始分析类AnnotationAwareAspectJAutoProxyCreator,根据类的继承关系,

AnnotationAwareAspectJAutoProxyCreator
->AspectJAwareAdvisorAutoProxyCreator
->AbstractAdvisorAutoProxyCreator
->AbstractAutoProxyCreator
可以看到最主要的是实现了两个接口,后置处理器SmartInstantiationAwareBeanPostProcessor和BeanFactoryAware

AbstractAutoProxyCreator最主要的方法其实在

 通过debug,在我们启动容器并创建目标类的时候,我们可以看到,在Bean初始化后会调用postProcessAfterInitialization方法,创建目标类的代理对象(有接口的使用JDK动态代理,没有接口的使用cglib)

切面内的通知方法会被封装成Advisor,在调用目标方法的时候,会根据表达式去匹配能用的Advisor(再次不作详述,可自行debug)

三、当我们在调用目标方法的时候,其实是调用的动态代理的拦截方法

在目标方法中,会将刚开始封装好的Advisor转换成拦截器链并保存在chain中,如果没有拦截器链,直接指向目标方法,如果有,则把目标方法,拦截器链信息封装在CglibMethodInvocation中,最终调用的是他的proceed()方法,然后根据递归一次去执行拦截器链的方法和目标方法(责任链模式)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值