当前代码存在的两个问题:
- 若存在多个目标对象,就需要使用多次ProxyFactoryBean来创建多个代理对象,这会使配置文件变的臃肿,不便于管理
- 用户真正想调用的是目标对象,而真正可以调用的却是代理对象
以上两个问题,均为ProxyFactoryBean类的功能太简单引起的,为解决以上问题,因此引入自动代理生成器
自动代理生成器
常用的自动代理生成器有两个:
- 默认advisor自动代理生成器 DefaultAdvisorAutoProxyCreator
<!--注册自动代理生成器-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
DefaultAdvisorAutoProxyCreator存在三个问题:
* 不能选择目标对象
* 不能选择切面类型,且切面只能是advisor
* 不能选择advisor,所以advisor均被作为切面织入到目标方法
因此使用Bean名称自动代理生成器
- Bean名称自动代理生成器
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="someService"/>
<property name="interceptorNames" value="myAdvice"/>
</bean>
自动代理生成器均继承自Bean后处理器BeanPostProcessor。容器中所有Bean在初始化时均会自动执行Bean后处理器中的方法,故其无需id属性。所以自动代理生成器的Bean也没有id属性,客户类直接使用目标对象bean的id