Spring Aop 详解
使用方法:
基于注解
@EnableAspectJAutoProxy
在方法上添加@Aspect 以及@Componect
@Pointcut
@Around
@return
@before
@after
@throw
基于xml
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<context:component-scan base-package="com.qcc.beans.aop"></context:component-scan>
实现过程:
通过 EnableAspectJAutoProxy 注解 在容器中置入一个AOP配置类
即 AspectJAutoProxyRegistrar 该类继承自 ImportBeanDefinitionRegister 接口
由容器 调用registerBeanDefinitions 实现 通过 AopConfigUtils 向容器注入 AnnotationAwareAspectJAutoProxyCreator 注解类型的 @Aspect的
来实现 Aop
AnnotationAwareAspectJAutoProxyCreator 的 类关系图如下
ProxyConfig -> ProxyProcessorSupport -> AbstractAutoProxyCreator
SmartInstantiationAwareBeanPostProcessor -> AbstractAutoProxyCreator
AbstractAutoProxyCreator -> AbstractAdvisorAutoProxyCreator -> AspectJAwareAdvisorAutoProxyCreator -> AnnotationAwareAspectJAutoProxyCreator
ProxyConfig 配置AOP的基本配置 主要就是 proxyTargetClass exposeProxy 两个配置
ProxyProcessorSupport 在 ProxyConfig 的基础上 评估切面 判断是使用 cglib 或者 JDKPROXY 即动态配置 proxyTargetClass
SmartInstantiationAwareBeanPostProcessor 该类继承 InstantiationAwareBeanPostProcessor(继承 BeanPostProcessor)
即如果继承该接口 需要实现四个方法
postProcessBeforeInstantiation
postProcessAfterInstantiation
该实现在类进行实例化时进行
postProcessBeforeInitialization
postProcessAfterInitialization
AbstractAutoProxyCreator 该类作为抽象类实现了上面的四个方法
主要是实现 上面的连个方法 postProcessBeforeInstantiation postProcessAfterInstantiation
postProcessBeforeInstantiation 实现AOP主要步骤
1,查看缓存中是否已有该bean的实现
2,判断该类是否为基础类Infrastructure的类
3,获取目标对象TargetSource
4,查找该类的所有拦截器(这个为主要需要理解的地方)
5, 根据需要AOP的类以及拦截器创建代理
其中最重要的是 4,5两步
第四步:
1,获取容器中所有的Advisor
2,从上面的Advisor中获取所有可以拦截目标类的advisor(其中AnnotationAwareAspectJAutoProxyCreator 会查找所有的适配类即所有的bean只要其中是配置由@Aspect的注解)
第五步:
1,根据上面获取到的所有Advisor,然后包装成拦截器 MethodInterceptor(MethodBeforeAdviceAdapter, AfterReturningAdviceAdapter ,ThrowsAdviceAdapter)
2, 将上面的Advisor以及beanClass beanName注入到ProxyFactory
3,调用 ProxyFactory.getProxy() 生成 代理对象
生成代理对象的细节:
1,调用AopProxyFactory.createAopProxy(AdvisedSupport config) 生成AopProxy对象
2,根据目标类是否由interface 或者 指定使用ProxyTargetClass为true则使用ObjenesisCglibAopProxy
3,否则使用 JdkDynamicAopProxy
4,根据 AopProxy 带哦用getProxy生成代理对象
执行:
获取该代理对象的拦截器链,使用ReflectiveMethodInvocation(CglibMethodInvocation) 注入代理对象以及拦截器链生成对象执行proceed
AbstractAutoProxyCreator.postProcessAfterInitialization(@Nullable Object bean, String beanName) throws BeansException
AbstractAutoProxyCreator.wrapIfNecessary(Object bean, String beanName, Object cacheKey)