Spring AOP原理解析——基于自动代理AOP是如何实现的?

  在上一篇(https://blog.csdn.net/u011983531/article/details/80359304)我们介绍了基于经典代理的AOP实现方案,在这一篇中,我们将看看基于自动代理的AOP是如何实现的。

//基于自动代理AOP
<bean id="sleepHelper" class="test.spring.aop.bean.SleepHelper"></bean>
<bean id="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice" ref="sleepHelper"/>
    <property name="pattern" value=".*sleep"/>
</bean>
<bean id="human" class="test.spring.aop.bean.Human"></bean>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

基于自动代理的AOP是使用DefaultAdvisorAutoProxyCreator来实现的。
首先来看看DefaultAdvisorAutoProxyCreator的层次结构。
《Spring AOP原理解析——基于自动代理AOP是如何实现的?》

DefaultAdvisorAutoProxyCreator实现了BeanPostProcessor接口,我们知道BeanPostProcessor接口实在Bean初始化前后执行一些逻辑,而为对象自动创建代理就是在后置处理中实现的。

整个实现过程可以分为下面几步:
1、读取配置文件,生成对应的BeanDefinition
2、调用ClassPathXmlApplicationContext的refresh()方法,refresh()方法会执行下面几步。
(1)实例化所有的BeanPostProcessor对象,并调用BeanFactory的addBeanPostProcessor(…)方法添加到Spring容器中
(2)调用BeanFactory的preInstantiateSingletons()方法,预先生成所有的单例Bean
(3)在第二步生成单例Bean的过程中,在Bean实例化和初始化前后会调用BeanPostProcessor的前置和后置处理。

其中,AOP的代理是在AbstractAutoProxyCreator的postProcessAfterInitialization(…)方法中实现的,该方法主要做了下面三件事情:
1、获取所有的Advisor
2、遍历所有Advisor,判断当前对象是否需要被拦截
3、如果需要被拦截,调用ProxyFactory的getProxy(…)方法为当前对象创建代理

    原文作者:AOP
    原文地址: https://blog.csdn.net/u011983531/article/details/80377764
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞