[英]Spring selectively use implementation instead of interface
找不到明確的答案,所以在這里提問 - 是否可以只為一個 bean 啟用 CGLIB 代理? 場景如下 - 我有一個自動裝配的類並且不實現任何接口,現在我想添加一個接口來覆蓋它的一小部分方法。 是否可以使用 CGLIB僅代理此類而不會影響 Spring 的默認行為(首選 JDK 動態代理)?
我正在使用基於 Java 的配置。
(當前)沒有任何開箱即用的支持來為單個類啟用基於類的代理。 相反,您必須自己創建代理。 這樣做的缺點是您需要對 Spring 的工作方式有一些深入了解(我碰巧有 :))。
您應該/可以使用ProxyFactory
或ProxyFactoryBean
為給定的類創建基於類的代理。 您的@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.