2017-01-25 27 views
0

我在多個stackoverflow問題中閱讀過applicationContext.getbean是一個壞主意。獲得給定類型的彈簧豆的最佳做法

Why is Spring's ApplicationContext.getBean considered bad?

我想知道是否有在春天掃描特定類型的豆的一種更好的方式。

我的用例是在春季啓動期間獲取給定類型的bean,並在這些bean上調用一些方法。

從我所知道的只有兩種方式來做到這一點。

  1. 自動裝入應用程序上下文到spring bean中並使用appContext.getBeansOfType。
  2. 胡克後處理器和

    濾我們給定類型的豆如果(類型的bean實例)

我覺得後處理器只處理一種類型的豆掛鉤是不是好主意。因爲這會攔截所有的bean初始化。

任何人都可以提出一個更好的方法來解決我的用例嗎? (給定類型的getBeans)

回答

1

春天有特殊處理List autowired參數。如果你指定一個bean,例如像這樣:

@Component 
class MyBean { 
    @Autowired 
    MyBean(List<MyType> listOfMytype) { 

    } 
} 

那麼Spring將不會搜索你的ApplicationContext以List<MyType>類型的豆,而是它會搜索實現MyType和將注入那些爲列表(which may suck if you actually want to get a list injected)所有的豆類。因此你得到了給定類型的所有bean。

+0

感謝您的回答。我還有一個問題。在這種情況下使用applicationContext.getBeansOfType有什麼問題?我們沒有將代碼耦合到具體的類。我們將它連接到一個抽象類(或可能是一個接口),我們通過自動裝配該類型的bean列表來完成這個抽象類。 – yaswanth

+0

@yaswanth:我認爲這更適合你鏈接的問題。令我驚訝的是,這個問題中現有的答案都沒有直接的例子,你可以看到效果。所以我加了一個:http://stackoverflow.com/a/41853545/327301 – yankee