第三章 AOP 自动创建代理

简介: <h1><span style="font-family:Calibri,serif"><span lang="en-US">3.5.1BeanNameAutoProxyCreator</span></span></h1> <div><span style="font-family:Calibri,serif"><span lang="en-US">        在之前的切面使用中,最

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


目录
相关文章
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
305 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
设计模式 Java 测试技术
spring复习04,静态代理动态代理,AOP
这篇文章讲解了Java代理模式的相关知识,包括静态代理和动态代理(JDK动态代理和CGLIB),以及AOP(面向切面编程)的概念和在Spring框架中的应用。文章还提供了详细的示例代码,演示了如何使用Spring AOP进行方法增强和代理对象的创建。
spring复习04,静态代理动态代理,AOP
|
缓存 安全 Java
Spring高手之路21——深入剖析Spring AOP代理对象的创建
本文详细介绍了Spring AOP代理对象的创建过程,分为三个核心步骤:判断是否增强、匹配增强器和创建代理对象。通过源码分析和时序图展示,深入剖析了Spring AOP的工作原理,帮助读者全面理解Spring AOP代理对象的生成机制及其实现细节。
458 0
Spring高手之路21——深入剖析Spring AOP代理对象的创建
|
缓存 安全 Java
Spring AOP 中两种代理类型的限制
【8月更文挑战第22天】
204 0
|
Java Spring
|
设计模式 安全 Java
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
3631 1
|
设计模式 Java Spring
Spring AOP基础之代理模式.静态代理和动态代理
Spring AOP基础之代理模式.静态代理和动态代理
188 0
Spring AOP基础之代理模式.静态代理和动态代理
|
Java 编译器 Maven
深入Spring原理-5.aop代理
深入Spring原理-5.aop代理
133 0
|
设计模式 缓存 Java
Spring AOP与静态代理/动态代理
我们一开始简单的初步认识了下代理模式,其中常见的实现方式有静态代理与动态代理,同时写了打印机🖨️的调用时机代码。接着我们思考🤔代理模式和我们使用spring aop有什么联系?简单的了解aop 与spring aop的实现方式。 最后我们比较了jdk 与cglib 的代理模式 ,接着简单过一遍Spring aop 的原理与执行流程。
253 0
|
Java Spring
Spring框架AOP静态代理
一、什么是AOP面向切面编程? AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过将横切关注点(如日志记录、事务管理等)从主业务逻辑中分离出来,提高代码的模块化和可维护性。 二、什么是静态代理? 静态代理是在编译时就已经确定了被代理对象和代理对象的关系,代理对象在运行时不会发生改变。通过静态代理,可以在调用被代理对象的方法之前或之后执行额外的逻辑,实现功能的增强或控制。
136 2