3.5.1BeanNameAutoProxyCreator
在之前的切面使用中,最后得通过ProxyFactoryBean类生成一个代理类,然后通过代理类对象获取目标类与目标类织入的增强信息。一个代理类对应一个目标类。如果我们有多个目标类的切面信息(切点与增强)都一样的,而我们必须在spring的配置文件中配置多个代理类来为多个目标类设置代理。
BeanNameAutoProxyCreator可以为多个Bean名字类似的目标类进行代理设置,而且多个目标类只需要设置一次。
下面使用前置增强、静态正则表达式方法配置的切面加上BeanNameAutoProxyCreator来进行测试:
a、增强类
在这里使用的是3.3.2的前置增强:
http://blog.csdn.net/p_3er/article/details/9239925
b、两个目标类
public class ProductDaoImpl { public void save(){ System.out.println("product被保存"); } }
public class UserDaoImpl { public void save() { System.out.println("保存用户..."); } public void delete() { System.out.println("删除用户..."); } }
c、配置
<!-- 增强Bean --> <bean id="userDaoBeforeAdvice" class="cn.framelife.spring.advice.UserDaoBeforeAdvice"></bean> <!-- 目标Bean --> <bean id="userDao" class="cn.framelife.spring.dao.impl.UserDaoImpl"></bean> <bean id="productDao" class="cn.framelife.spring.dao.impl.ProductDaoImpl"></bean> <!-- 切面 --> <bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" p:advice-ref="userDaoBeforeAdvice"> <property name="patterns"> <list> <value>.*save</value> </list> </property> </bean> <!-- 设置代理 p:beanNames="*Dao" 表示以Dao结尾的Bean都交由这个代理设置管理 --> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" p:interceptorNames="regexpAdvisor" p:beanNames="*Dao" p:proxyTargetClass="true" />
d、测试
UserDaoImpl userDao = (UserDaoImpl) context.getBean("userDao"); userDao.save(); userDao.delete(); ProductDaoImpl productDao = (ProductDaoImpl) context.getBean("productDao"); productDao.save();
e、结果
我是前置增强:save 保存用户... 删除用户... 我是前置增强:save product被保存
3.5.2DefaultAdvisorAutoProxyCreator
org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator能够扫描容器中的Advisor,并将Advisor自动自动织入到匹配的Bean中,即为匹配的目标Bean自动创建代理。
其它不变,把3.5.1中的配置修改如下:
<!-- 增强Bean --> <bean id="userDaoBeforeAdvice" class="cn.framelife.spring.advice.UserDaoBeforeAdvice"></bean> <!-- 目标Bean --> <bean id="userDao" class="cn.framelife.spring.dao.impl.UserDaoImpl"></bean> <bean id="productDao" class="cn.framelife.spring.dao.impl.ProductDaoImpl"></bean> <!-- 切面 --> <bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" p:advice-ref="userDaoBeforeAdvice"> <property name="patterns"> <list> <value>.*save</value> </list> </property> </bean> <!-- 配置自动代理类 --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
也就是去掉3.5.1中的代理类配置那一块。加上上面配置"配置自动代理类"部分。
测试与结果与3.5.1的一样。
时间: 2024-10-29 04:10:24