添加注解时并未设置proxyTargetClass=true 但是创建代理时创建的却是CGLIB代理?

文章详细阐述了SpringBoot在自动配置过程中如何处理代理机制,特别是当`spring.aop.proxy-target-class`设置为`true`时,系统将使用CGLIB进行代理。`spring-configuration-metadata.json`文件配置了默认值,导致CglibAutoProxyConfiguration的注册。文章通过分析`TransactionAutoConfiguration`类的代码,展示了在不同条件下的代理选择逻辑。

之前理解不准确,重新解答

spring-boot-autoconfigure下有个文件spring-configuration-metadata.json  ,配置了auto,proxy-target-class默认为true 即开启CGLIB 代理。

经过验证, spring.aop.proxy-target-class 和注解配置中有一个设置为true,则就走CGLIB 代理。 

因为auto,proxy-target-class 默认为true,所以会注册CglibAutoProxyConfiguration。 

// 在指定自动配置类应用之后应用
@AutoConfiguration(after = { JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
		DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class })
//仅在类 PlatformTransactionManager 存在于 classpath 上时生效
@ConditionalOnClass(PlatformTransactionManager.class)
// 确保前缀为 spring.transaction 的事务有关属性配置项被加载到 bean TransactionProperties
@EnableConfigurationProperties(TransactionProperties.class)
public class TransactionAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean  // 仅在该 bean 不存在时才定义
	public TransactionManagerCustomizers platformTransactionManagerCustomizers(
			ObjectProvider<PlatformTransactionManagerCustomizer<?>> customizers) {
		return new TransactionManagerCustomizers(customizers.orderedStream().collect(Collectors.toList()));
	}

	@Bean
	@ConditionalOnMissingBean   // 仅在该 bean 不存在时才定义
	@ConditionalOnSingleCandidate(ReactiveTransactionManager.class)   // 仅在只有一个 ReactiveTransactionManager bean 时才生效
	public TransactionalOperator transactionalOperator(ReactiveTransactionManager transactionManager) {
		return TransactionalOperator.create(transactionManager);
	}

	@Configuration(proxyBeanMethods = false)
	@ConditionalOnSingleCandidate(PlatformTransactionManager.class)   // 仅在只有一个 PlatformTransactionManager bean 时才生效
	public static class TransactionTemplateConfiguration {

		@Bean
		@ConditionalOnMissingBean(TransactionOperations.class)  // 仅在只有一个 TransactionOperations bean 时才生效
		public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
			return new TransactionTemplate(transactionManager);
		}

	}

	@Configuration(proxyBeanMethods = false)
	// 仅在 bean TransactionManager 存在时才生效
	@ConditionalOnBean(TransactionManager.class)
	// 仅在 bean AbstractTransactionManagementConfiguration 不存在时才生效
	@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)
	public static class EnableTransactionManagementConfiguration {

		@Configuration(proxyBeanMethods = false)
		@EnableTransactionManagement(proxyTargetClass = false)
        // 在属性 spring.aop.proxy-target-class 被明确设置为 false 时启用注解 
		@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false")
		public static class JdkDynamicAutoProxyConfiguration {

		}

		@Configuration(proxyBeanMethods = false)
		@EnableTransactionManagement(proxyTargetClass = true)
        //在属性 spring.aop.proxy-target-class 缺失或者被明确设置为 true 时启用注解 
		@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",
				matchIfMissing = true)
		public static class CglibAutoProxyConfiguration {

		}

	}

}

在注册过程中因为proxyTargetClass 设置为true,所以会去找到自动代理器,并设置属性值proxyTargetClass为true表示强制使用CGLIB的动态代理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值