之前理解不准确,重新解答
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的动态代理。

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

被折叠的 条评论
为什么被折叠?



