@EnableAspectJAutoProxy
这个注解是spring启用在自己的容器中注册了一个组件
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProx
AspectJAutoProxyRegistrar就是在spring注册了这个类,这个类实现了ImportBeanDefinitionRegistrar
重写registerBeanDefinitions方法,
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
即注册了个应该beanName为org.springframework.aop.config.internalAutoProxyCreator 对象值为AnnotationAwareAspectJAutoProxyCreator的
AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
SmartInstantiationAwareBeanPostProcessor又实现InstantiationAwareBeanPostProcessor接口。
实现了InstantiationAwareBeanPostProcessor后置处理的接口 会再容器初始化完成bean以后执行器 后置处理器的before和after方法,BeanFactoryAware表示 其子类是可以拿到spring的 BeanFactory的,也就是所有bean的对象,不然你aspectj中怎么执行,被增强对象的 增强方法,因为增强的方法属于spring管理的对象的方法。(不是只接new 对象调用的方法)
spring的源码片段
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[])
try { //给后置处理器一个机会返回一个目标对象的代理,这个就是给后置处理器来生成代理的方法。
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBefor