2012-09-30 93 views
13

我在Spring中的ref和depends-on屬性之間感到困惑。我讀了spring文檔,但我仍然感到困惑。我想知道兩者之間的確切區別,並且在哪種情況下應該使用一個。ref vs依賴於Spring的屬性

回答

19

按照spring documentation

如果你需要表達對多個bean的依賴,可以提供bean的名稱列表作爲'取決於-on屬性,用逗號,空格和分號所有的值有效的分隔符,就像這樣:

<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao"> 
    <property name="manager" ref="manager" /> 
</bean> 

<bean id="manager" class="ManagerBean" /> 
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" /> 

的「依賴-on屬性和屬性不僅用來指定初始化時的依賴,而且還指定相應的銷燬時的依賴(在單豆的情況下,只有)。在'depends-on'屬性中定義的依賴bean將在相關bean本身被銷燬之前首先銷燬。這因此也允許您控制關閉順序。

另一方面,對於大多數情況來說,一個bean是另一個bean的依賴關係,這一事實表示爲一個bean被設置爲另一個bean的屬性。這通常通過基於XML的配置元數據中的元素來完成。

<bean id="a" class="ClassA"/> 
<bean id="b" class="ClassB"> 
<property name="aref" ref="a" /> 
</bean> 
+0

這是很好的解釋:) – Krishna

+0

@Anshu如果我不知道是什麼豆ID,但全名? – verystrongjoe

+0

這對於使bean等待bean B構建非常有用,即使B不是A的屬性。我在測試中需要網絡代理在客戶端之前被初始化,儘管客戶端一無所知代理。 – Wheezil

10

此外, http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/context/annotation/DependsOn.html

取決於接通 - > 豆在其上當前bean依賴。 指定的任何bean都將保證在此bean之前由容器創建。 在bean沒有明確依賴另一個屬性或構造函數參數的情況下使用,而是取決於另一個bean初始化的副作用。

在提供以下說法錯誤的是上面的回答,

「中定義的依賴豆'取決於-on屬性將被破壞之前首先到相關的bean本身被破壞」

主要的bean將被首先銷燬,然後依賴的bean將被銷燬。

這裏是我的測試結果,

破壞了主類被調用。

消除依賴被稱爲。

3

也許一個需要依賴的情況的例子會有所幫助。我使用Spring來加載和連接我的bean。下面是一個例子bean定義:

<bean id="myBean" class="my.package.Class"> 
    <property name="destination" value="bean:otherBeanId?method=doSomething"/> 
</bean> 

<bean id="otherBeanId" class="my.package.OtherClass"/> 

注意,屬性值是一個字符串,它引用otherBeanId。由於這個變量被解析的方式,Spring並不知道依賴關係,所以它可能會破壞otherBeanId然後myBean。這可能導致myBean處於中斷狀態。

我可以使用取決於如下來解決這個問題:

<bean id="myBean" class="my.package.Class" depends-on="otherBeanId"> 
    <property name="destination" value="bean:otherBeanId?method=doSomething"/> 
</bean>