aop动态代理可以用两种技术jdk动态代理和cglib动态代理

zqlmianshi / 2024-09-25 / 原文

Spring AOP(面向切面编程)在实现动态代理时,实际上可以使用两种不同的技术:JDK动态代理和CGLIB动态代理。具体使用哪一种技术取决于具体的情况。

1. **JDK动态代理**:
- JDK动态代理只能代理实现了接口的类。
- 如果目标类实现了一个或多个接口,Spring AOP默认会使用JDK动态代理。
- JDK动态代理创建的代理对象是目标类的接口类型,这意味着你只能通过接口来调用方法。

2. **CGLIB动态代理**:
- CGLIB(Code Generation Library)代理可以代理没有实现接口的类。
- 如果目标类没有实现任何接口,Spring AOP会使用CGLIB来生成代理类。
- CGLIB动态代理通过生成目标类的子类来创建代理对象,因此不能代理`final`类和`final`方法。

Spring会根据以下规则决定使用哪种代理机制:
- 如果目标类实现了至少一个接口,默认使用JDK动态代理。
- 如果目标类没有实现任何接口,Spring会自动切换到使用CGLIB动态代理。
- 你也可以通过配置强制Spring使用CGLIB代理,例如在Spring配置文件中设置`proxy-target-class`属性为`true`。

```xml
<aop:config proxy-target-class="true">
<!-- AOP配置 -->
</aop:config>
```

或者在Java配置中使用`@EnableAspectJAutoProxy`注解:

```java
@EnableAspectJAutoProxy(proxyTargetClass = true)
@Configuration
public class AppConfig {
// Bean definitions
}
```

总结来说,Spring AOP可以根据目标类的结构和配置选择使用JDK动态代理或CGLIB动态代理。