AOP原理:【看给容器中注册了什么组件,这个组件什么时候工作,这个组件的功能是什么?】
开始AOP,我们就需要引入@EnableAspectJAutoProxy注解。但是这个注解为什么加上就能提供AOP的功能呢?
看其源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
/**
* Indicate whether subclass-based (CGLIB) proxies are to be created as opposed
* to standard Java interface-based proxies. The default is {@code false}.
*/
boolean proxyTargetClass() default false;
/**
* Indicate that the proxy should be exposed by the AOP framework as a {@code ThreadLocal}
* for retrieval via the {@link org.springframework.aop.framework.AopContext} class.
* Off by default, i.e. no guarantees that {@code AopContext} access will work.
* @since 4.3.1
*/
boolean exposeProxy() default false;
}
可以看出:是依靠引入AspectJAutoProxyRegistrar.class来实现AOP功能的,那@AspectJAutoProxyRegistrar.class又是怎么实现AOP的呢?我们继续向下看:
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar
AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,该接口只有待实现的
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
方法,那我们看一下,在AspectJAutoProxyRegistrar中这个方法的具体实现:
@Override
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
AnnotationAttributes enableAspectJAutoProxy =
AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
}
}