`
p_3er
  • 浏览: 55712 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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


分享到:
评论

相关推荐

    JavaEE spring半自动实现AOP代理

    - 如果目标对象实现了接口,Spring将使用JDK的`java.lang.reflect.Proxy`类来创建代理,这样就可以在不修改原有代码的情况下,为对象添加额外的行为。 2. **CGLIB代理**: - 对于没有实现接口的对象,Spring会...

    .Net动态代理AOP拦截

    3. **生成器(Generator)**:生成器是用于创建代理类的对象,如Castle.DynamicProxy.ProxyGenerator。它可以生成一个继承自目标类型并实现了拦截器接口的新类。 4. **增强(Advice)**:在AOP中,增强是指在拦截器...

    第三章:Spring AOP API 设计与实现1

    19. **AbstractAutoProxyCreator**:IoC容器自动代理抽象,根据配置自动创建代理对象。 20. **AspectJEnable模块驱动实现 - @EnableAspectJAutoProxy**:注解驱动方式启用AspectJ自动代理。 21. **AspectJ XML配置...

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    2. **第三章_proxy-demo.zip**:这个例子可能展示了如何创建和使用动态代理。你可能会看到如何通过Spring AOP自定义代理类,以及如何利用JDK动态代理和CGLIB来拦截并增强方法的执行。 3. **第六章_cache-demo.zip**...

    第二章:Spring AOP 基础1

    - Spring AOP支持自动动态代理,根据需要创建代理实例。 9. **TargetSource替换**: - 可以替换目标源对象,允许在运行时更改被代理的对象。 10. **Spring核心基础**: - Spring IoC容器、Bean生命周期、配置元...

    第九章 Spring4 AOP

    标题 "第九章 Spring4 AOP" 指的是Spring框架中的面向切面编程(Aspect-Oriented Programming,简称AOP)部分。AOP是Spring框架的核心特性之一,它允许开发者在不修改原有业务代码的情况下,对系统进行横切关注点的...

    C#版本AOP注入

    在C#中,实现AOP注入主要有两种方式:使用IL weaving工具(如PostSharp)在编译时进行切面织入,或者使用第三方库(如Unity、Autofac、Castle Windsor)在运行时进行动态代理。这里我们主要讨论后者,因为它是更灵活...

    C# .net Aop 动态截获异常

    在C#中,我们通常使用代理类或第三方库(如PostSharp、Castle Windsor等)来实现AOP。 在"C# .NET Aop 动态截获异常"的场景中,我们将重点关注如何捕获和处理程序运行过程中的异常。这通常涉及到以下几个关键步骤:...

    spring切面AOP所使用的jar包

    - 使用AOP:Spring会自动为匹配的切点创建代理,并在合适的时候执行通知。 6. **实际应用**: 在SSH(Struts2 + Spring + Hibernate)架构中,Spring AOP常用于事务管理。当一个业务操作涉及多个数据库操作时,...

    第五章示例代码__AOP入门

    织入是将切面应用到目标对象并创建代理的过程。这可以在编译时(静态织入)、加载时(动态织入)或运行时(基于代理的织入)完成。Spring AOP默认采用基于代理的织入。 现在,让我们通过一个简单的例子来理解AOP的...

    AOP需要的Jar包

    4. **cglib-nodep_2.1_3.jar**:这是Code Generation Library的一个版本,不依赖于其他的第三方库。当Spring AOP无法使用Java标准的动态代理(例如,目标类没有接口)时,会使用CGLIB来创建目标对象的子类,从而实现...

    SpringBoot第 9 讲:SpringBoot+AOP

    Spring AOP有两种实现方式:代理模式(Proxy-based AOP)和基于ASM的字节码增强(Bytecode-based AOP)。代理模式主要通过JDK动态代理或CGLIB实现,适用于接口或非最终类。字节码增强则在运行时修改类的字节码,...

    Spring动态代理第三方依赖jar.zip_aopalliance_1.0.jar_aspectjrt_aspectjweav

    本压缩包包含的是Spring动态代理中需要用到的一些关键第三方依赖,包括aopalliance-1.0.jar、aspectjrt-1.7.2.jar以及aspectjweaver-1.7.2.jar。这些库文件对于理解和使用Spring的AOP功能至关重要。 首先,aop...

    android aop

    在Android中实现AOP,通常会用到一些第三方库,如AspectJX、DexMaker、ByteBuddy等。其中,AspectJX是基于Java代理的实现,它提供了一种简单的方式来引入AOP概念到Android项目中。AspectJX允许开发者定义切面...

    spring.net结合三层AOP异常日志记录功能

    3. **Spring.NET AOP实现**:Spring.NET AOP使用代理模式实现,支持方法前、后通知和异常通知。在异常情况下,可以定义一个切面来捕获并处理异常,同时记录日志。 4. **异常日志记录**:日志记录是系统故障排查的...

    C# 实现 AOP微型框架

    6. **C#实现**:在VS2008中,实现AOP框架可能涉及到使用`System.Reflection`来获取类型信息,然后利用`System.Reflection.Emit`或第三方库创建动态代理类,实现对方法调用的拦截和通知的插入。 7. **微型框架**:与...

    Spring实现AOP的四种方式

    **第三种:纯POJO切面** 在Spring的AOP命名空间中,你可以使用如`&lt;aop:advisor&gt;`、`&lt;aop:after&gt;`等标签来定义通知。这种方式允许你以声明的方式配置切面,而无需实现特定的接口或使用注解。 **第四种:注入式...

    C#实现的IOC和AOP框架,供学习

    在C#中,通常通过接口和抽象类来实现依赖注入,同时可以利用微软的Unity、Autofac或Ninject等第三方IOC容器来简化这一过程。IOC容器负责解析依赖关系,根据配置自动创建对象并注入到其他对象中,使得代码更加灵活。 ...

    Android-AOP实现无侵入提高开发效率工具

    在Android中,我们可以使用第三方库如AspectJX或者Android Annotation Processing(APT)来实现AOP。AspectJX是一个基于Java代理的AOP库,它可以方便地在Android项目中引入切面。而APT则是在编译时处理注解,生成...

    C#_AOP_案例

    C#中的AOP主要通过动态代理技术来实现,例如.NET框架提供的System.Reflection.Emit或者第三方库如PostSharp、Castle Dynamic Proxy。 在C#中,AOP的应用场景包括但不限于: 1. 日志记录:在方法调用前后自动记录...

Global site tag (gtag.js) - Google Analytics