【Spring源码】Java里面的jdk代理与Cglib动态代理

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 动态代理非常方便。
相关推荐
布朗克1685 分钟前
Go入门到精通-22-同步原语
开发语言·后端·golang·同步原语
程序员清风10 分钟前
公司要裁员之前,都会有哪些信号?
java·后端·面试
Flittly11 分钟前
【AgentScope Java新手村系列】(20)文字转语音TTS
java·spring boot·spring
帅次17 分钟前
Kotlin Flow 与 StateFlow:UI 单向数据流基础
开发语言·ui·kotlin·stateflow·onlifecycle
唠点键盘之外的31 分钟前
10 Spring Boot + 大模型:Java 项目接入 AI 的三种姿势
java·spring boot·aigc·cursor
NWU_LK32 分钟前
【WebFlux】第五篇 —— 两种编程模型与 WebClient
java
艾伦野鸽ggg33 分钟前
JavaScript 浏览器本地存储
开发语言·javascript·ecmascript
增量星球34 分钟前
《持续交付2.0系列六》业务需求协作管理
java·运维·自动化·devops·持续部署·持续集成
重生之我是Java开发战士1 小时前
【Java EE】Spring IoC 与 DI
java·spring·java-ee
霸道流氓气质1 小时前
SpringBoot+Vue通过ModbusTCP协议实现PLC 设备连接、重连实时控制
vue.js·spring boot·后端