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动态代理。
标签:jdk,JDK,Spring,代理,接口,CGLIB,动态 From: https://www.cnblogs.com/zqlmianshi/p/18429647