spring-AOP源码详解

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值