第三章 AOP 自动创建代理

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的一样。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值