详解在Spring中如何自动创建代理

时间:2021-05-19

Spring 提供了自动代理机制,可以让容器自动生成代理,从而把开发人员从繁琐的配置中解脱出来 。 具体是使用 BeanPostProcessor 来实现这项功能。

1 BeanPostProcessor

BeanPostProcessor 代理创建器的实现类可以分为 3 类:

类型 实现类 基于 Bean 配置名规则 BeanNameAutoProxyCreator 基于 Advisor 匹配规则 DefaultAdvisorAutoProxyCreator 基于 Bean 中的 AspectJ 注解标签的匹配规则 AnnotationAwareAspectJAutoProxyCreator

BeanPostProcessor 类继承关系

所有的自动代理器类都实现了 BeanPostPorcessor ,在容器实例化 Bean 时, BeanPostProcessor 将对它进行加工处理,所以自动代理创建器能够对满足匹配规则的 bean 自动创建代理对象。

2 BeanNameAutoProxyCreator
假设有以下两个实体类(用户与充电宝)。

用户类:

public class User { public void rent(String userId) { System.out.println("User:租赁【充电宝】"); } public void back(String userId){ System.out.println("User:归还【充电宝】"); }}

充电宝:

public class Charger { public void rent(String userId) { System.out.println("Charger:【充电宝】被租赁"); }}

我们希望通过 BeanNameAutoProxyCreator 通过 Bean 的名称来自动创建代理,实现增强:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://.deniro.spring4.aop.RentBeforeAdvice"/><!-- 静态正则表达式方法名匹配--><bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" p:advice-ref="rentBeforeAdvice"> <!-- 匹配模式--> <property name="patterns"> <list> <!-- 匹配字符串--> <value>.*rent.*</value> </list> </property></bean><!-- 使用 DefaultAdvisorAutoProxyCreator--><bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

首先我们配置了以静态正则表达式方法名匹配的切面,然后直接配置了 DefaultAdvisorAutoProxyCreator Bean。

测试代码与输出结果与上一小节的 BeanNameAutoProxyCreator 相同。

JDK 动态代理是通过接口来实现方法拦截,所以必须确保要拦截的目标在接口中有定义。

CGLib 动态代理是通过动态生成代理子类来实现方法拦截,所以必须确保要拦截的目标方法可以被子类所访问,也就是目标方法必须定义为非 final, 且非私有实例方法 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章