您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。