Spring在 IOC 容器中 Bean 之間的關係
一、在 Spring IOC 容器中 Bean 之間存在繼承和依賴關係。
需要注意的是,這個繼承和依賴指的是 bean 的配置之間的關係,而不是指實際意義上類與類之間的繼承與依賴,它們不是一個概念。
二、Bean 之間的繼承關係。
1.被繼承的 ban 稱為父 bean,繼承這個父 bean 的 bean 稱為子 bean。父 bean 可以通過指定 abstract 屬性來宣告為抽象的,子 bean 通過指定 parent 屬性來指定父 bean 的引用。
2.子 bean 從父 bean 中繼承配置,包括 bean 的屬性配置,同時也可以覆蓋從父 bean 繼承過來的配置。如:
<bean class="com.linuxidc.spring.bean.Employee" id="employee" p:empName="emp01" p:age="23"/> <bean class="com.linuxidc.spring.bean.Employee" id="employee2" p:empName="emp02" parent="employee"/>
其中 employee2 繼承了 employee,繼承了 employee 的 age 屬性,覆蓋了 empName 屬性。
3.若想父 bean 只是作為一個模板,可以設定 <bean> 的 abstract 屬性為 true,IOC 容器將不會例項化這個 bean。若直接獲得,則會報一個 BeanIsAbstractException 的異常。
4.並不是父 bean 的所有屬性都會被繼承,像 abstract 和 autowire 這樣的屬性就不會被繼承。
5.也可以忽略父 bean 的 class 屬性,讓子 bean 指定自己的類,而共享相同的屬性配置。如:
<bean class="com.linuxidc.spring.bean.Employee" id="employee" p:empName="emp01" p:age="23"/> <bean class="com.linuxidc.spring.bean.Employee2" id="employee22" p:address="123mutouren"parent="employee"/>
三、Bean 之間的依賴關係
1.通過 <bean> 的屬性 depends-on 屬性來指定該 Bean 的前置依賴。所謂的前置依賴是指:在 IOC 在初始化時刻,例項化配置檔案中的 bean 時,前置依賴的 bean 要在該 bean 例項化之前例項化。
2.例子:
/** * @author solverpeng * @create 2016-07-18-15:07 */ public class First { public First() { System.out.println("我被例項化了! 我是 First"); } }
/** * @author solverpeng * @create 2016-07-18-15:08 */ public class Second { public Second() { System.out.println("我被例項化了! 我是 Second"); } }
e1:在沒有新增 depends-on 屬性前。
<bean class="com.linuxidc.spring.bean.First" id="first"/> <bean class="com.linuxidc.spring.bean.Second" id="second"/>
控制檯輸出:
我被例項化了! 我是 Second
我被例項化了! 我是 First
<bean class="com.linuxidc.spring.bean.Second" id="second"/> <bean class="com.linuxidc.spring.bean.First" id="first"/>
控制檯輸出:
我被例項化了! 我是 Second
我被例項化了! 我是 First
結論:由上述可以看出,在不指定 depends-on 的前提下,IOC 容器預設例項化的順序是按照 bean 在配置檔案中的順序來例項化的。
e2:新增 depends-on 屬性
<bean class="com.linuxidc.spring.bean.First" id="first" depends-on="second"/> <bean class="com.linuxidc.spring.bean.Second" id="second"/>
控制檯輸出:
我被例項化了! 我是 Second
我被例項化了! 我是 First
3.如果前置依賴於多個 Bean,則可以通過逗號或空格的方式指定多個依賴。並且是按照先後順序進行例項化。如:
<bean class="com.linuxidc.spring.bean.First" id="first" depends-on="third second"/> <bean class="com.linuxidc.spring.bean.Second" id="second"/> <bean class="com.linuxidc.spring.bean.Third" id="third"/>
控制檯輸出:
我被例項化了! 我是 Third
我被例項化了! 我是 Second
我被例項化了! 我是 First