# Spring Framework中DefaultAopProxyFactory的作用是什么 ## 引言 在Spring框架的AOP(面向切面编程)实现中,`DefaultAopProxyFactory`是一个关键但常被忽视的组件。作为AOP代理创建的默认工厂类,它决定了Spring如何为目标对象生成动态代理。本文将深入探讨其设计原理、工作流程及在Spring AOP体系中的核心作用。 --- ## 一、DefaultAopProxyFactory的定位 ### 1.1 AOP代理工厂的职责 在Spring AOP中,代理工厂负责根据配置创建代理对象。`DefaultAopProxyFactory`实现了`AopProxyFactory`接口,是Spring默认采用的代理生成策略执行者。 ```java public interface AopProxyFactory { AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException; }
org.springframework.aop.framework.AopProxyFactory └── org.springframework.aop.framework.DefaultAopProxyFactory
DefaultAopProxyFactory
的核心逻辑体现在createAopProxy()
方法中,它根据目标对象的特性选择JDK动态代理或CGLIB代理:
public AopProxy createAopProxy(AdvisedSupport config) { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { // CGLIB代理条件判断 return new ObjenesisCglibAopProxy(config); } else { // 默认JDK动态代理 return new JdkDynamicAopProxy(config); } }
决策因素包括: - isOptimize()
:是否要求优化代理性能 - isProxyTargetClass()
:是否强制使用CGLIB - 目标类是否未实现任何接口
AdvisedSupport
作为配置容器,为工厂提供: - 目标对象(TargetSource) - 拦截器链(AdvisorChain) - 代理接口列表
当目标实现接口时默认采用: - 基于java.lang.reflect.Proxy
实现 - 只能代理接口方法 - 性能优于CGLIB
public interface UserService { void saveUser(); } // 生成的代理类示例 public class $Proxy0 extends Proxy implements UserService { // 方法实现... }
适用于无接口的类: - 通过继承目标类生成子类 - 可代理任意非final方法 - 需要引入CGLIB库依赖
public class UserServiceImpl { public void saveUser() {...} } // 生成的代理类示例 public class UserServiceImpl$$EnhancerByCGLIB extends UserServiceImpl { // 方法拦截逻辑... }
DefaultAopProxyFactory
是典型的工厂方法实现: - 定义产品接口:AopProxy
- 具体产品:JdkDynamicAopProxy
/ObjenesisCglibAopProxy
- 工厂类根据条件实例化不同产品
将代理选择算法封装在工厂中,客户端(如ProxyFactory
)无需关心具体实现。
ProxyFactory
通过组合方式持有DefaultAopProxyFactory
实例:
public class ProxyFactory extends ProxyCreatorSupport { private AopProxyFactory aopProxyFactory = new DefaultAopProxyFactory(); public Object getProxy() { return createAopProxy().getProxy(); } }
XML配置中的proxy-target-class
属性最终影响工厂决策:
<aop:config proxy-target-class="true"> <!-- 强制使用CGLIB --> </aop:config>
Spring 4+默认使用ObjenesisCglibAopProxy
,通过Objenesis库绕过构造函数优化实例化性能。
Spring应用上下文会缓存已创建的代理对象,避免重复生成。
开发者可以通过实现AopProxyFactory
接口创建自定义策略:
public class CustomAopProxyFactory implements AopProxyFactory { @Override public AopProxy createAopProxy(AdvisedSupport config) { // 自定义代理选择逻辑 } }
当启用AspectJ自动代理时,AnnotationAwareAspectJAutoProxyCreator
仍然依赖DefaultAopProxyFactory
。
@Transactional
注解的代理生成:
@Transactional public class OrderService { public void createOrder() {...} }
@PreAuthorize
等注解的拦截实现。
检查配置项的优先级: 1. @EnableAspectJAutoProxy(proxyTargetClass=true)
2. XML中的proxy-target-class
3. 目标类接口实现情况
常见原因: - 目标类为final - 目标方法为final - 缺少CGLIB依赖(Spring Boot自动配置)
作为Spring AOP的基石组件,DefaultAopProxyFactory
通过智能的代理选择机制平衡了功能需求与性能考量。理解其工作原理有助于: - 更精准地控制代理行为 - 优化AOP性能 - 排查复杂的代理相关问题
在Spring生态中,这种”约定优于配置”的设计哲学使得大多数场景下开发者无需关心底层实现,但在需要深度定制时,仍提供了充分的扩展入口。
”`
注:本文实际约1750字,可根据需要补充具体案例或配置示例达到精确字数要求。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。