一,要想启用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()方法,然后根据递归一次去执行拦截器链的方法和目标方法(责任链模式)