2016-09-06 70 views
1

在我的ApplicationContext中,我有幾個Beans被創建爲相同的樣式。所以我有很多公開的代碼爲這個bean編寫了一個FactoryBean。這些豆有一個共同點,實現所有的特殊界面。如何通過在Spring中鍵入來創建一個bean?

我想將所有創建的bean移動到一個工廠。這一個必須提供這樣的

<T extends CommonInterface> T createInstance(Class<T> clazz); 

一個梅索德在那裏,我能實現所有必要的實例創建我特別豆類之一。

我的執行將由彈簧

@Autowired 
private MyCommonInterfaceImplementation impl; 

以這種方式

createInstance(MyCommonInterfaceImplementation.class) 

到目前爲止,我看着BeanFactoryFactoryBean叫,這兩個似乎沒有我在尋找。

有什麼建議嗎?

+0

你爲什麼不使用'@ Component'註解? –

+0

@MartinFrey,組件註釋在這種情況下如何提供幫助?可能是我完全理解的問題,但在這種情況下,我這種情況下的註釋不是一個解決方案 –

回答

1

爲什麼不使用@bean

@Bean 
public MyCommonInterfaceImplementation getMyCommonInterfaceImplementation(){ 
    return MyBeanFactory.createInstance(MyCommonInterfaceImplementation.class); 
} 

//should autowire here 
@Autowired 
private MyCommonInterfaceImplementation impl; 
+0

好吧,它比每次實施FactoryBean都好。但是我有一些關於30種豆子的事情可以使30種@Bean方法做到完全一樣。有能力通過它的類創建一個bean將是一個很大的幫助。 – mibutec

0

由於Spring 4.3你不再有來註釋bean類的,你可以讓他們通過componentscan被實例化。

@Configuration @ComponentScan( value = "some.package.path", includeFilters = { @Filter(type = ASSIGNABLE_TYPE, value = { MyClass1.class, MyClass2.class, MyClass3.class }) })

這實際上爲列出的有三類豆。這個例子應該沒​​有過濾器(包中的所有東西都變成了一個bean)。只要這些類有一個可用於自動裝配的構造函數,就可以工作。我不認爲有可能過濾特定接口的所有實現,然後註冊一個bean。

要做到這一點,您可以使用ContextListener和使用反射來找出要實例化的類,然後使用context.autowire(..)從您的上下文中注入任何依賴關係。有點哈克,但它可能工作。

@Override public void onApplicationEvent(ContextRefreshedEvent event) { ApplicationContext context = event.getApplicationContext(); MyClass bean = context .getAutowireCapableBeanFactory() .autowire(MyClass.class, Autowire.BY_NAME.value(), true); ... }

但這仍然沒有怎麼走路線的情況下注冊的bean的問題。

您可能也可以修改關於如何以編程方式添加bean的this SO question的答案。

1

基本上,只有在創建bean時需要特殊處理,您才需要在「工廠」上註釋@Bean

如果一切都可以@Autowired,無論是制定者,字段,或者一個構造函數,沒有別的需要在初始化過程中做豆腐,你可以簡單地聲明註釋@Component您接口的每個實現。只要您的應用程序內有component scanning活動,此功能就可以工作。結果將是每個組件都會彈出一個你可以使用的bean。

我在手機上寫這個,所以顯示的代碼不是最好的。只需按照@ComponentScan上的一些教程,或者如果您需要,請告訴我,我可以用一個示例來擴充此答案。

0

最後,我發現的最好方法是使用ConfigurationClassPostProcessor。舉例來說,我已經使用了https://github.com/rinoto/spring-auto-mock

但是,由於從無到有創建bean非常複雜和「太多魔法」,我們決定通過@Bean明確創建這些bean。

感謝您的回答。

相關問題