上述中的aop编程15-18可能产生的问题:
1.若存在多个目标对象,就需要使用多次proxyFactoryBean创建多个代理对象,这会使配置文件变得臃肿,不便于管理。
2.用户真正想调用的是目标对象,而真正可以调用的却是代理对象,这不符合正常逻辑。
所以现在使用自动代理生成器。
自动代理生成器分成两种:
1.默认Advisor自动代理生成器
1 2
| <bean id=“ISomeService” class=“com.bean.service5.someServiceImpl”></bean> <bean id=“ISomeService2” class=“com.bean.service5.someServiceImpl”></bean>
|
改为:
1 2 3 4 5 6 7 8
| <!– 生成代理对象 –> <bean id=“serviceProxy” class=“org.springframework.aop.framework.ProxyFactoryBean”> <!– 指定目标对象 –> <property name=“target” ref=“ISomeService”></property> <!– 指定切面–> <property name=“interceptorNames” value=“myAdvisor”></property> </bean> <bean>
|
改为:
1
| <bean class=“org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator”></bean>
|
DefaultAdvisorAutoProxyCreator引发的三个问题:
1.不能选择目标对象
2.不能选择切面类型,切面只能是advisor
3.不能选择advisor,所有advisor均将作为切面织入到目标方法
2.Bean名称自动代理生成器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <bean id=“myAdvisor” class=“org.springframework.aop.support.RegexpMethodPointcutAdvisor”> <property name=“advice” ref=“myadvice”></property> <!– 这里的正则表达式匹配的对象是全限定方法名 –> <property name=“pattern” value=“.*doFirst”></property> </bean> <bean id=“myAdvisor2” class=“org.springframework.aop.support.RegexpMethodPointcutAdvisor”> <property name=“advice” ref=“myadvice”></property> <!– 这里的正则表达式匹配的对象是全限定方法名 –> <property name=“pattern” value=“.*dosend”></property> </bean> <bean class=“org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”> <property name=“target” ref=“ISomeService”></property> <!– 指定切面–> <property name=“interceptorNames” value=“myAdvisor”></property> </bean>
|