大家好,今天我会用一个例子来讲解Spring创建bean代理对象的过程,为大家揭开Spring AOP的神秘面纱。在看这篇博客前我强烈建议读者先看下这两篇博客《Spring3.1.0实现原理分析(六).实例化》,《Spring3.1.0实现原理分析(七).填充Bean属性,初始化Bean,登记善后处理,注册单例Bean》, 这两篇博客分析了Spring创建对象的完整过程,有助于你能更好地理解本文的内容。
下面是例子的bean定义配置,
<bean id="accountDao" class="testaop.com.qiujy.dao.AccountDaoMySQLImpl"/>
<bean id="accountService" class="testaop.com.qiujy.service.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean>
<!-- 日志切面类 -->
<bean id="logAspectBean" class="testaop.com.qiujy.aspect.LogAspect" />
<!-- AOP配置 -->
<aop:config>
<!-- 配置一个切面 -->
<aop:aspect id="logAspect" ref="logAspectBean">
<!-- 定义切入点,指定切入点表达式 (spring目前仅支持方法的切入,不支持属性的切入) -->
<aop:pointcut id="allMethod" expression="execution(* testaop.com.qiujy.service.*.*(..))"/>
<!-- 前置通知 -->
<aop:before method="before" pointcut-ref="allMethod" />
</aop:aspect>
</aop:config>
在这个例子中一共有6个bean对象需要创建,它们的ID如下(为了便于描述我对ID进行了简化处理),
1. accountDao,
2. accountService,
3. logAspectBean,
4. internalAutoProxyCreator, (用于创建代理对象的bean后处理器,该对象是Spring检测到存在aop配置自动添加的)
5. AspectJPointcutAdvisor#0, (通知器)
6. allMethod (切入点)
下面我按照这6个对象的创建顺序进行讲解。
一. 创建internalAutoProxyCreator