【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 动态代理非常方便。
相关推荐
Mr.Daozhi几秒前
跨境电商选品完整流水线:Google Trends筛词+Meta广告分析,CLI工具设计实战
开发语言·爬虫·python·跨境电商·工具链·选品
多彩电脑1 分钟前
Swift里字符串的索引
开发语言·swift
SoftLipaRZC1 分钟前
C语言预处理详解:从宏定义到条件编译
c语言·开发语言
会周易的程序员1 分钟前
C++ 对象池深度解析:架构设计与实现原理
开发语言·c++·物联网·iot·aiot
我登哥MVP3 分钟前
Spring Boot 从“会用”到“精通”:Model-Map原理
java·spring boot·后端·spring·servlet·maven·mybatis
L_09076 分钟前
【C++】智能指针
开发语言·c++·智能指针
程序猿乐锅7 分钟前
【苍穹外卖|Day02】后台接口自测闭环:Token、DTO 与 yml 配置
java·开发语言
心之伊始10 分钟前
Spring Boot Actuator + Micrometer 自定义业务指标:不只是健康检查
java·架构·源码分析·csdn
冰暮流星16 分钟前
javascript之对象的建立-使用Object
开发语言·javascript·ecmascript
Eason_LYC18 分钟前
【GetShell 实战】CVE-2026-34486 Tomcat 加密拦截器绕过:从漏洞验证到反弹 Shell 全流程
java·渗透测试·tomcat·java反序列化·rce·远程代码执行漏洞·cve-2026-34486