目錄
上章講了自動裝配,本章將講繼承、依賴
一、知識點
- Spring 允許繼承 bean 的配置, 被繼承的 bean 稱爲父 bean. 繼承這個父 Bean 的 Bean 稱爲子 Bean
- 子 Bean 從父 Bean 中繼承配置, 包括 Bean 的屬性配置
- 子 Bean 也可以覆蓋從父 Bean 繼承過來的配置
- 父 Bean 可以作爲配置模板, 也可以作爲 Bean 實例. 若只想把父 Bean 作爲模板, 可以設置 <bean> 的abstract 屬性爲 true, 這樣 Spring 將不會實例化這個 Bean
- 並不是 <bean> 元素裏的所有屬性都會被繼承. 比如: autowire, abstract 等.
- 也可以忽略父 Bean 的 class 屬性, 讓子 Bean 指定自己的類, 而共享相同的屬性配置. 但此時 abstract 必須設爲 true
二、 例子
我也是繼續在前一章項目的基礎上通過添加包和之前的代碼隔開
2.1 繼承例子
2.1.1 目錄結構
紅框的是本章代碼,其它的是前一些章節的代碼
2.1.2 XML配置
src右擊-->new-->XML Configuration File-->Spring config-->輸入名字“beans-relaton”
<bean id="address" class="com.hualinux.beans.autowire.Address"
p:city="BeiJing" p:street="HuiLongGuan"/>
<bean id="address2" class="com.hualinux.beans.autowire.Address"
p:city="BeiJing" p:street="DaZhongSi" parent="address"/>
2.1.3測試
com.hualinux.beans.relaton.Main.java代碼
package com.hualinux.beans.relaton;
import com.hualinux.beans.autowire.Address;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-relaton.xml");
Address address= (Address) ctx.getBean("address");
System.out.println(address);
address= (Address) ctx.getBean("address2");
System.out.println(address);
}
}
運行結果:
Address{city='BeiJing', street='HuiLongGuan'}
Address{city='BeiJing', street='DaZhongSi'}
2.2 抽象bean例子
beans-relaton.xml修改如下
<bean id="addressTemplate" class="com.hualinux.beans.autowire.Address" abstract="true">
<property name="city" value="廣州(默認)" />
<property name="street" value="天河(默認)" />
</bean>
<bean id="address2" class="com.hualinux.beans.autowire.Address"
parent="addressTemplate"/>
<!-- <bean id="address" class="com.hualinux.beans.autowire.Address"
p:city="BeiJing" p:street="HuiLongGuan"/>
<bean id="address2" class="com.hualinux.beans.autowire.Address"
p:city="BeiJing" p:street="DaZhongSi" parent="address"/>-->
src-->com.hualinux.beans.relaton.Main.java代碼修改如下
package com.hualinux.beans.relaton;
import com.hualinux.beans.autowire.Address;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-relaton.xml");
/* Address address= (Address) ctx.getBean("address");
System.out.println(address);*/
Address address= (Address) ctx.getBean("address2");
System.out.println(address);
}
}
運行main結果如下
Address{city='廣州(默認)', street='天河(默認)'}
2.3 依賴 例子
beans-relaton.xml修改如下
<bean id="addressTemplate" class="com.hualinux.beans.autowire.Address" abstract="true">
<property name="city" value="廣州(默認)" />
<property name="street" value="天河(默認)" />
</bean>
<bean id="address2" class="com.hualinux.beans.autowire.Address"
parent="addressTemplate"/>
<bean id="car" class="com.hualinux.beans.autowire.Car">
<property name="brand" value="寶馬x7"/>
<property name="price" value="1500000"/>
</bean>
<!-- 要求再配置Person時,必須有一個關聯的car! 換句話說person這個bean依賴於名爲car的bean-->
<bean id="person" class="com.hualinux.beans.autowire.Person"
p:name="Tom" p:address-ref="address2" depends-on="car"/>
<!-- <bean id="address" class="com.hualinux.beans.autowire.Address"
p:city="BeiJing" p:street="HuiLongGuan"/>
<bean id="address2" class="com.hualinux.beans.autowire.Address"
p:city="BeiJing" p:street="DaZhongSi" parent="address"/>-->
src-->com.hualinux.beans.relaton.Main.java代碼修改如下
package com.hualinux.beans.relaton;
import com.hualinux.beans.autowire.Address;
import com.hualinux.beans.autowire.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-relaton.xml");
/* Address address= (Address) ctx.getBean("address");
System.out.println(address);*/
/*
Address address= (Address) ctx.getBean("address2");
System.out.println(address);
*/
Person person= (Person) ctx.getBean("person");
System.out.println(person);
}
}
運行結果:
Person{name='Tom', address=Address{city='廣州(默認)', street='天河(默認)'}, car=null}