簡體   English   中英

Spring 引導默認代理機制

[英]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-classmatchIfMissing = true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM