欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 14:29:26
...

  在上一篇(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(…)方法为当前对象创建代理