大家都知道,AOP 底层是动态代理,而 Java 中的动态代理有两种实现方式:
- 基于 JDK 的动态代理
- 基于 Cglib 的动态代理
这两者最大的区别在于基于 JDK 的动态代理需要被代理的对象有接口,而基于 Cglib 的动态代理并不需要被代理对象有接口。
那么小伙伴们不禁要问,Spring 中的 AOP 是怎么实现的?是基于 JDK 的动态代理还是基于 Cglib 的动态代理?
1. Spring
先来说结论,Spring 中的动态代理,具体用哪种,分情况:
- 如果代理对象有接口,就用 JDK 动态代理,否则就是 Cglib 动态代理。
- 如果代理对象没有接口,那么就直接是 Cglib 动态代理。
来看看这段来自官方文档的说辞:
可以看到,即使在最新版的 Spring 中,依然是如上策略不变。即能用 JDK 做动态代理就用 JDK,不能用 JDK 做动态代理就用 Cglib,即首选 JDK 做动态代理。
2. Spring Boot
Spring Boot 和 Spring 一脉相承,那么在动态代理这个问题上是否也是相同的策略呢?抱歉,这个还真不一样。
Spring Boot 中对这个问题的处理,以 Spring Boot2.0 为节点,前后不一样。
在 Spring Boot2.0 之前,关于 Aop 的自动化配置代码是这样的(Spring Boot 1.5.22.RELEASE
):
@Configuration
@ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class })
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing &