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

时间: 2024-10-29 04:10:24

第三章 AOP 自动创建代理的相关文章

第三章 AOP 通过Java API创建切面

    在前面使用增强的时候,我们发现增强会被织入到目标类的所有的方法中.我们如果把增强织入到目标类的特定的方法中,需要使用切点进行目标连接点的定位.然后我们可以通过切点及增强生成一个切面了. 3.4.1切点类型 静态方法切点:org.springframework.aop.support.StaticMethodMatcherPointcut 动态方法切点:org.springframework.aop.support.DynamicMethodMatcherPointcut 注解切点:org

第三章 AOP 通过Java API创建增强

3.3.1增强类型 前置增强:org.springframework.aop.MethodBeforeAdvice 后置增强:org.springframework.aop.AfterReturningAdvice 环绕增强:org.aopalliance.intercept.MethodInterceptor 异常抛出增强:org.springframework.aop.ThrowsAdvice 引介增强:org.springframework.aop.support.DelegatingIn

第三章 AOP 基于Schema的AOP

        基于Schema定义的切面和前现两种方式定义的切面,内容上都差不多,只是表现形式不一样而已. 3.7.1一般增强的使用 a.目标类 public class Target { public void say(){ System.out.println("say..."); } public String getName(int id,String name){ System.out.println("getName..."); return &quo

第三章 AOP 编程选择

         Spring为我们开发者提供了多种AOP的编程方式.我们该如何选择呢? 如果项目采用的是JDK5.0以上版本,我们可以选择@AspectJ的方式.这是第一选择. http://blog.csdn.net/p_3er/article/details/9268637 如果使用的是低版本的JDK,那么可以考虑使用<aop:aspect>,也就是Schema的方式. http://blog.csdn.net/p_3er/article/details/9269407 如果需要一些特殊

Pro JavaScript Techniques第三章: 创建可重用的代码

 Pro JavaScript Techniques第三章: 创建可重用的代码 mozart0 [楼主] 匪徒田老大 版主 帖子 2326体力 6628 威望 177 注册 2003-6-18 #1 发表于 2007-4-8 12:46  资料  短消息  加为好友  Pro Javascript Techniques翻译连载:说明和目录 当与其它程序员共同开发代码时(这里对大多数合作或团队项目来说是很常见的),为了保持你们的清醒而维护良好的编程惯例将会变得极其重要.随着近年来JavaScrip

spring基础概念AOP与动态代理理解_java

一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 以简单模拟事务的执行过程说明各种代理区别 1.1 静态代理 由程序员创建或由特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. public interface PersonDao { vo

&amp;gt; 前言(补充) 和第三章 第一个C#程序(rainbow 翻译)(来自重粒子空间)

程序 <<展现C#>> 前言(补充) 和第三章 第一个C#程序(rainbow 翻译)   出处:http://www.informit.com/matter/ser0000001/chapter1/ch03.shtml 正文: 前言0.1  提要    欢迎阅读<展现 C#>(Presenting C#).这本书是你提高企业编程语言的一条捷径.这种企业编程语言带有下一代编程语言服务运行时(NGWS Runtime):C#(发音"C sharp").

SQL Server Alwayson创建代理作业的注意事项详解

前言 Always On 可用性组活动辅助功能包括支持在辅助副本上执行备份操作. 备份操作可能会给 I/O 和 CPU 带来很大的压力(使用备份压缩). 将备份负荷转移到已同步或正在同步的辅助副本后,您可以使用承载第一层工作负荷的主副本的服务器实例上的资源,您可以创建主数据库的任何类型的备份. 也可以创建辅助数据库的日志备份和仅复制完整备份.下面话不多说了,来一起看看详细的介绍吧. 一.概念 1.辅助副本上支持的备份类型 BACKUP DATABASE :在辅助副仅支持数据库.文件或文件组的仅复

JavaScript ECMA-262-3 深入解析.第三章.this_javascript技巧

介绍 在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节.讨论的主题就是this关键字. 实践证明,这个主题很难,在不同执行上下文中确定this的值经常会发生问题. 许多程序员习惯的认为,在程序语言中,this关键字与面向对象程序开发紧密相关,其完全指向由构造器新创建的对象.在ECMAScript规范中也是这样实现的,但正如我们将看到那样,在ECMAScript中,this并不限于只用来指向新创建的对象. 下面让我们更详细的了解一下,在ECMAScript中this的值到底是什么? 定义 t