986
技術社區[雲棲]
第三章 AOP 自動創建代理
3.5.1BeanNameAutoProxyCreator
在之前的切麵使用中,最後得通過ProxyFactoryBean類生成一個代理類,然後通過代理類對象獲取目標類與目標類織入的增強信息。一個代理類對應一個目標類。如果我們有多個目標類的切麵信息(切點與增強)都一樣的,而我們必須在spring的配置文件中配置多個代理類來為多個目標類設置代理。
BeanNameAutoProxyCreator可以為多個Bean名字類似的目標類進行代理設置,而且多個目標類隻需要設置一次。
下麵使用前置增強、靜態正則表達式方法配置的切麵加上BeanNameAutoProxyCreator來進行測試:
a、增強類
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 ></bean> <!-- 目標Bean --> <bean ></bean> <bean ></bean> <!-- 切麵 --> <bean p:advice-ref="userDaoBeforeAdvice"> <property name="patterns"> <list> <value>.*save</value> </list> </property> </bean> <!-- 設置代理 p:beanNames="*Dao" 表示以Dao結尾的Bean都交由這個代理設置管理 --> <bean 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 ></bean> <!-- 目標Bean --> <bean ></bean> <bean ></bean> <!-- 切麵 --> <bean p:advice-ref="userDaoBeforeAdvice"> <property name="patterns"> <list> <value>.*save</value> </list> </property> </bean> <!-- 配置自動代理類 --> <bean ></bean>
也就是去掉3.5.1中的代理類配置那一塊。加上上麵配置"配置自動代理類"部分。
測試與結果與3.5.1的一樣。
最後更新:2017-04-03 16:48:31