Springboot默認使用的是Cglib動態代理
案例一:TransactionAutoConfiguration配置類
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
@Configuration(proxyBeanMethods = false)@ConditionalOnBean(TransactionManager.class)@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)public static class EnableTransactionManagementConfiguration {@Configuration(proxyBeanMethods = false)@EnableTransactionManagement(proxyTargetClass = false)@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false",matchIfMissing = false)public static class JdkDynamicAutoProxyConfiguration {}@Configuration(proxyBeanMethods = false)@EnableTransactionManagement(proxyTargetClass = true)@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",matchIfMissing = true)public static class CglibAutoProxyConfiguration {}}
案例二:AopAutoConfiguration配置類
@Configuration(proxyBeanMethods = false)@ConditionalOnClass(Advice.class)static class AspectJAutoProxyingConfiguration {@Configuration(proxyBeanMethods = false)@EnableAspectJAutoProxy(proxyTargetClass = false)@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false",matchIfMissing = false)static class JdkDynamicAutoProxyConfiguration {}@Configuration(proxyBeanMethods = false)@EnableAspectJAutoProxy(proxyTargetClass = true)@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",matchIfMissing = true)static class CglibAutoProxyConfiguration {}}
JDK動態代理與Cglib動態代理
為什么Springboot會使用Cglib動態代理
- 性能和速度: Cglib 動態代理在性能上通常比標準的JDK 動態代理更快。Cglib 直接通過字節碼生成子類來實現代理,避免了一些反射操作,因此在方法調用等方面通常更加高效。
- 無需接口: JDK 動態代理要求目標類必須實現一個接口,而 Cglib 動態代理不需要。這使得 Cglib 更適用于那些沒有接口的類,從而擴展了動態代理的適用范圍。
- 無侵入性: Spring Boot 選擇 Cglib 動態代理可以使你的類無需實現任何接口或繼承特定的類,從而減少了對源代碼的侵入性。這對于集成第三方庫或需要代理的現有類特別有用。
- 方便集成: Spring Boot 默認提供了 Cglib 相關的依賴,因此在應用程序中使用 Cglib 動態代理非常方便。