一、在 Spring IOC 容器中 Bean 之間存在繼承和依賴關系。
需要注意的是,這個繼承和依賴指的是 bean 的配置之間的關系,而不是指實際意義上類與類之間的繼承與依賴,它們不是一個概念。
二、Bean 之間的繼承關系。
1.被繼承的 ban 稱為父 bean,繼承這個父 bean 的 bean 稱為子 bean。父 bean 可以通過指定 abstract 屬性來聲明為抽象的,子 bean 通過指定 parent 屬性來指定父 bean 的引用。
2.子 bean 從父 bean 中繼承配置,包括 bean 的屬性配置,同時也可以覆蓋從父 bean 繼承過來的配置。如:
<bean class="com.nucsoft.spring.bean.Employee" id="employee" p:empName="emp01" p:age="23"/> <bean class="com.nucsoft.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.nucsoft.spring.bean.Employee" id="employee" p:empName="emp01" p:age="23"/> <bean class="com.nucsoft.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.nucsoft.spring.bean.First" id="first"/> <bean class="com.nucsoft.spring.bean.Second" id="second"/>
控制台輸出:
我被實例化了! 我是 Second
我被實例化了! 我是 First
<bean class="com.nucsoft.spring.bean.Second" id="second"/> <bean class="com.nucsoft.spring.bean.First" id="first"/>
控制台輸出:
我被實例化了! 我是 Second
我被實例化了! 我是 First
結論:由上述可以看出,在不指定 depends-on 的前提下,IOC 容器默認實例化的順序是按照 bean 在配置文件中的順序來實例化的。
e2:添加 depends-on 屬性
<bean class="com.nucsoft.spring.bean.First" id="first" depends-on="second"/> <bean class="com.nucsoft.spring.bean.Second" id="second"/>
控制台輸出:
我被實例化了! 我是 Second
我被實例化了! 我是 First
3.如果前置依賴於多個 Bean,則可以通過逗號或空格的方式指定多個依賴。並且是按照先後順序進行實例化。如:
<bean class="com.nucsoft.spring.bean.First" id="first" depends-on="third second"/> <bean class="com.nucsoft.spring.bean.Second" id="second"/> <bean class="com.nucsoft.spring.bean.Third" id="third"/>
控制台輸出:
我被實例化了! 我是 Third
我被實例化了! 我是 Second
我被實例化了! 我是 First