1. 程式人生 > >Spring在 IOC 容器中 Bean 之間的關係

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