簡體   English   中英

Spring 有選擇地使用實現而不是接口

[英]Spring selectively use implementation instead of interface

找不到明確的答案,所以在這里提問 - 是否可以只為一個 bean 啟用 CGLIB 代理? 場景如下 - 我有一個自動裝配的類並且不實現任何接口,現在我想添加一個接口來覆蓋它的一小部分方法。 是否可以使用 CGLIB代理此類而不會影響 Spring 的默認行為(首選 JDK 動態代理)?
我正在使用基於 Java 的配置。

(當前)沒有任何開箱即用的支持來為單個類啟用基於類的代理。 相反,您必須自己創建代理。 這樣做的缺點是您需要對 Spring 的工作方式有一些深入了解(我碰巧有 :))。

您應該/可以使用ProxyFactoryProxyFactoryBean為給定的類創建基於類的代理。 您的@Bean方法將返回代理而不是實際的類。 Spring 足夠聰明(至少它應該)檢測到它已經是代理,而不是再次代理它,它應該將建議添加到已經創建的代理中。 為了在不破壞自動連接和 Spring 提供的所有其他好處的情況下完成這項工作,您可能想要創建一個特定的BeanPostProcessor來處理這個問題。

public YourBeanPostProcessor implements BeanPostProcessor {

    public  Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof YourBean) {
            ProxyFactory factory = new ProxyFactory(bean);
            factory.setProxyTargetClass(true);
            return factory.getProxy();
        }
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

像通常使用BeanPostProcessor一樣將其注冊為BeanPostProcessor

@Bean
public static YourBeanPostProcessor yourBeanPostProcessor() {
    return new YourBeanPostProcessor();
}

現在你有一個預先創建的基於類的代理,它應該被 Spring 檢測和使用。

暫無
暫無

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

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