天天看點

Spring在 IOC 容器中 Bean 之間的關系

一、在 Spring IOC 容器中 Bean 之間存在繼承和依賴關系。

需要注意的是,這個繼承和依賴指的是 bean 的配置之間的關系,而不是指實際意義上類與類之間的繼承與依賴,它們不是一個概念。

二、Bean 之間的繼承關系。

1.被繼承的 ban 稱為父 bean,繼承這個父 bean 的 bean 稱為子 bean。父 bean 可以通過指定 abstract 屬性來聲明為抽象的,子 bean 通過指定 parent 屬性來指定父 bean 的引用。

2.子 bean 從父 bean 中繼承配置,包括 bean 的屬性配置,同時也可以覆寫從父 bean 繼承過來的配置。如:

其中 employee2 繼承了 employee,繼承了 employee 的 age 屬性,覆寫了 empName 屬性。

3.若想父 bean 隻是作為一個模闆,可以設定 <bean> 的 abstract 屬性為 true,IOC 容器将不會執行個體化這個 bean。若直接獲得,則會報一個 BeanIsAbstractException 的異常。

4.并不是父 bean 的所有屬性都會被繼承,像 abstract 和 autowire 這樣的屬性就不會被繼承。

5.也可以忽略父 bean 的 class 屬性,讓子 bean 指定自己的類,而共享相同的屬性配置。如:

三、Bean 之間的依賴關系

1.通過 <bean> 的屬性 depends-on 屬性來指定該 Bean 的前置依賴。所謂的前置依賴是指:在 IOC 在初始化時刻,執行個體化配置檔案中的 bean 時,前置依賴的 bean 要在該 bean 執行個體化之前執行個體化。

2.例子:

e1:在沒有添加 depends-on 屬性前。

控制台輸出:

我被執行個體化了! 我是 Second

我被執行個體化了! 我是 First

結論:由上述可以看出,在不指定 depends-on 的前提下,IOC 容器預設執行個體化的順序是按照 bean 在配置檔案中的順序來執行個體化的。

e2:添加 depends-on 屬性

3.如果前置依賴于多個 Bean,則可以通過逗号或空格的方式指定多個依賴。并且是按照先後順序進行執行個體化。如:

我被執行個體化了! 我是 Third