閱讀986 返回首頁    go 技術社區[雲棲]


第三章 AOP 自動創建代理

3.5.1BeanNameAutoProxyCreator

        在之前的切麵使用中,最後得通過ProxyFactoryBean類生成一個代理類,然後通過代理類對象獲取目標類與目標類織入的增強信息。一個代理類對應一個目標類。如果我們有多個目標類的切麵信息(切點與增強)都一樣的,而我們必須在spring的配置文件中配置多個代理類來為多個目標類設置代理。
        
        BeanNameAutoProxyCreator可以為多個Bean名字類似的目標類進行代理設置,而且多個目標類隻需要設置一次。
        
       下麵使用前置增強、靜態正則表達式方法配置的切麵加上BeanNameAutoProxyCreator來進行測試:

a、增強類

在這裏使用的是3.3.2的前置增強:

https://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  ></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

  上一篇:go 我筆下的“名著”
  下一篇:go 金庸筆下的愛情故事