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 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的一样。
分享到:
相关推荐
- 如果目标对象实现了接口,Spring将使用JDK的`java.lang.reflect.Proxy`类来创建代理,这样就可以在不修改原有代码的情况下,为对象添加额外的行为。 2. **CGLIB代理**: - 对于没有实现接口的对象,Spring会...
3. **生成器(Generator)**:生成器是用于创建代理类的对象,如Castle.DynamicProxy.ProxyGenerator。它可以生成一个继承自目标类型并实现了拦截器接口的新类。 4. **增强(Advice)**:在AOP中,增强是指在拦截器...
19. **AbstractAutoProxyCreator**:IoC容器自动代理抽象,根据配置自动创建代理对象。 20. **AspectJEnable模块驱动实现 - @EnableAspectJAutoProxy**:注解驱动方式启用AspectJ自动代理。 21. **AspectJ XML配置...
2. **第三章_proxy-demo.zip**:这个例子可能展示了如何创建和使用动态代理。你可能会看到如何通过Spring AOP自定义代理类,以及如何利用JDK动态代理和CGLIB来拦截并增强方法的执行。 3. **第六章_cache-demo.zip**...
- Spring AOP支持自动动态代理,根据需要创建代理实例。 9. **TargetSource替换**: - 可以替换目标源对象,允许在运行时更改被代理的对象。 10. **Spring核心基础**: - Spring IoC容器、Bean生命周期、配置元...
标题 "第九章 Spring4 AOP" 指的是Spring框架中的面向切面编程(Aspect-Oriented Programming,简称AOP)部分。AOP是Spring框架的核心特性之一,它允许开发者在不修改原有业务代码的情况下,对系统进行横切关注点的...
在C#中,实现AOP注入主要有两种方式:使用IL weaving工具(如PostSharp)在编译时进行切面织入,或者使用第三方库(如Unity、Autofac、Castle Windsor)在运行时进行动态代理。这里我们主要讨论后者,因为它是更灵活...
在C#中,我们通常使用代理类或第三方库(如PostSharp、Castle Windsor等)来实现AOP。 在"C# .NET Aop 动态截获异常"的场景中,我们将重点关注如何捕获和处理程序运行过程中的异常。这通常涉及到以下几个关键步骤:...
- 使用AOP:Spring会自动为匹配的切点创建代理,并在合适的时候执行通知。 6. **实际应用**: 在SSH(Struts2 + Spring + Hibernate)架构中,Spring AOP常用于事务管理。当一个业务操作涉及多个数据库操作时,...
织入是将切面应用到目标对象并创建代理的过程。这可以在编译时(静态织入)、加载时(动态织入)或运行时(基于代理的织入)完成。Spring AOP默认采用基于代理的织入。 现在,让我们通过一个简单的例子来理解AOP的...
4. **cglib-nodep_2.1_3.jar**:这是Code Generation Library的一个版本,不依赖于其他的第三方库。当Spring AOP无法使用Java标准的动态代理(例如,目标类没有接口)时,会使用CGLIB来创建目标对象的子类,从而实现...
Spring AOP有两种实现方式:代理模式(Proxy-based AOP)和基于ASM的字节码增强(Bytecode-based AOP)。代理模式主要通过JDK动态代理或CGLIB实现,适用于接口或非最终类。字节码增强则在运行时修改类的字节码,...
本压缩包包含的是Spring动态代理中需要用到的一些关键第三方依赖,包括aopalliance-1.0.jar、aspectjrt-1.7.2.jar以及aspectjweaver-1.7.2.jar。这些库文件对于理解和使用Spring的AOP功能至关重要。 首先,aop...
在Android中实现AOP,通常会用到一些第三方库,如AspectJX、DexMaker、ByteBuddy等。其中,AspectJX是基于Java代理的实现,它提供了一种简单的方式来引入AOP概念到Android项目中。AspectJX允许开发者定义切面...
3. **Spring.NET AOP实现**:Spring.NET AOP使用代理模式实现,支持方法前、后通知和异常通知。在异常情况下,可以定义一个切面来捕获并处理异常,同时记录日志。 4. **异常日志记录**:日志记录是系统故障排查的...
6. **C#实现**:在VS2008中,实现AOP框架可能涉及到使用`System.Reflection`来获取类型信息,然后利用`System.Reflection.Emit`或第三方库创建动态代理类,实现对方法调用的拦截和通知的插入。 7. **微型框架**:与...
**第三种:纯POJO切面** 在Spring的AOP命名空间中,你可以使用如`<aop:advisor>`、`<aop:after>`等标签来定义通知。这种方式允许你以声明的方式配置切面,而无需实现特定的接口或使用注解。 **第四种:注入式...
在C#中,通常通过接口和抽象类来实现依赖注入,同时可以利用微软的Unity、Autofac或Ninject等第三方IOC容器来简化这一过程。IOC容器负责解析依赖关系,根据配置自动创建对象并注入到其他对象中,使得代码更加灵活。 ...
在Android中,我们可以使用第三方库如AspectJX或者Android Annotation Processing(APT)来实现AOP。AspectJX是一个基于Java代理的AOP库,它可以方便地在Android项目中引入切面。而APT则是在编译时处理注解,生成...
C#中的AOP主要通过动态代理技术来实现,例如.NET框架提供的System.Reflection.Emit或者第三方库如PostSharp、Castle Dynamic Proxy。 在C#中,AOP的应用场景包括但不限于: 1. 日志记录:在方法调用前后自动记录...