![](/img/trans.png)
[英]Spring recommendations: proxying mechanism vs @Transactional on class or interface
[英]Spring Boot default proxying mechanism
最近我發現spring 文檔頁面說:
Spring AOP 使用 JDK 動態代理或 CGLIB 為給定目標 object 創建代理。 (當您有選擇時,首選 JDK 動態代理)。
如果要代理的目標 object 至少實現一個接口,則將使用 JDK 動態代理。
但在我的應用程序中似乎並非如此。 我想寫一個小基准來比較兩種代理的性能。
有兩個類似的類。 兩者都有一個用@Transactional
注釋注釋的方法。 一個 class 實現接口,另一個不實現:
@Service
public class Cglib {
@Transactional
public void method() {}
}
public interface Dynamic {
void method();
}
@Service
public class DynamicImpl implements Dynamic {
@Override
@Transactional
public void method() {}
}
根據第一個 class 的文檔,應該創建一個 CGLIB 代理,第二個應該創建一個 JDK 動態代理。
但在我的情況下,CGLIB 用於兩個類:
@Component
@RequiredArgsConstructor
public class Runner implements ApplicationRunner {
private final Cglib cglib;
private final Dynamic dynamic;
@Override
public void run(ApplicationArguments args) {
System.out.println(cglib.getClass());
System.out.println(dynamic.getClass());
}
}
class com.example.demo.proxy.cglib.Cglib$$EnhancerBySpringCGLIB$$767ff22
class com.example.demo.proxy.dynamic.DynamicImpl$$EnhancerBySpringCGLIB$$20a564d6
應用程序中沒有其他配置。 只有@SpringBootApplication
class 通過 spring initializr 生成
難道我做錯了什么? 該代碼在 Spring Boot 2.7.2 和 JDK 17 上運行。
這是由於spring-boot 自動配置:
@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")
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 {
}
}
當屬性@EnableTransactionManagement(proxyTargetClass = true)
spring.aop.proxy-target-class
未設置spring.aop.proxy-target-class
( matchIfMissing = true
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.