2012-12-07 117 views
24

是否有指定要實例化bean的順序?即我想讓特定的bean在其他bean之前實例化,就像啓動順序一樣。Spring 3 bean實例化序列

我使用Spring 3.2和基於註釋的聲明方法。

+0

在我的練習中,實例化順序等於xml配置文件中的順序。但是可能有例外。 –

回答

52

如果豆通過定義<property/>,或@Autowired然後<constructor-arg/>的順序取決於豆由Spring容器被迫並固定。這裏沒問題。

但是,如果要強制執行bean創建的特定順序未表示通過顯式依賴隨意使用:

<bean id="A" depends-on="B"/> 
<bean id="B"/> 

或更好的(與註釋,還與@Bean Java配置):

@Service 
@DependsOn("B") 
public class A {} 

甚至更​​好...不要使用它。這些構造是一種代碼氣味,並且經常表明你的組件之間有一些令人討厭的不可見依賴。

+5

+1代碼異味說明 – ElderMael

3

您可以使用bean上的Ordered接口定義相對於其他bean的順序。

5

同意Tomasz提供的答案。如果你知道bean A依賴於bean B,那麼這是正確的方法。

有時你應該在所有bean實例化之前執行邏輯。在這種情況下,您可以使用BeanFactoryPostProcessor。 Spring首先創建並執行BeanFactoryPostProcessor,然後創建並執行所有其他bean。同時,如果你的BeanFactoryPostProcessor依賴於某個bean A,你可以使用屬性或構造函數注入。在這種情況下,Spring將首先創建bean A,然後是BeanFactoryPostProcessor,然後調用BeanFactoryPostProcessor,之後只會在上下文中安裝所有其他bean。

+0

我用它從系統屬性文件設置spring.active.profile設置。很棒! –

相關問題