05--Spring內部Bean和父子Bean
阿新 • • 發佈:2018-12-12
1. 內部Bean(inner bean)
當希望一個bean只被某一個類使用時,我們可以使用內部bean。內部bean此時作為某一個類的屬性,只能通過該類例項化。
- bean
package com.lyc.cn.v2.day01.inner; public class Outer { /** 姓名 **/ private String name; /** 年齡 **/ private int age; /** 內部bean **/ private Inner inner; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Inner getInner() { return inner; } public void setInner(Inner inner) { this.inner = inner; } public void sayHello() { System.out.println("outer-->name:" + name + ",age:" + age); System.out.println("inner-->name:" + inner.getName() + ",age:" + inner.getAge()); } } package com.lyc.cn.v2.day01.inner; public class Inner { /** 姓名 **/ private String name; /** 年齡 **/ private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
- xml
<!--InnerBean--> <bean id="outer" class="com.lyc.cn.v2.day01.inner.Outer"> <property name="name" value="我是一個外部bean"></property> <property name="age" value="20"></property> <!--注意這裡是property屬性,不是beanName--> <property name="inner"> <bean class="com.lyc.cn.v2.day01.inner.Inner"> <property name="name" value="我是一個內部bean"></property> <property name="age" value="10"></property> </bean> </property> </bean>
2.父子bean
封裝、繼承、多型是java的面向物件的基本元素,同樣,Spring中的bean也可以存在繼承關係。
子bean必須與父bean保持相容,也就是說子bean中必須有父bean定義的所有屬性
父bean必須是抽象bean或者定義lazy-init=true也就是不讓bean工廠例項化該bean abstract="true" Spring不會例項化該bean
- bean
package com.lyc.cn.v2.day01.parent; /** * 定義父bean * @author: LiYanChao * @create: 2018-09-07 16:36 */ public class Father { /** 姓名 **/ private String name; /** 年齡 **/ private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } package com.lyc.cn.v2.day01.parent; package com.lyc.cn.v2.day01.parent; /** * 定義子bean,注意這裡SunBean和ParentBean之間無繼承關係, * 而是通過配置檔案維護其父子關係 * @author: LiYanChao * @create: 2018-09-07 16:36 */ public class Sun { /** 姓名 **/ private String name; /** 年齡 **/ private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void sayHello() { System.out.println("nage: " + name + ", age: " + age); } }
- xml
<!-- ====================父子bean==================== -->
<!-- 子bean必須與父bean保持相容,也就是說子bean中必須有父bean定義的所有屬性 -->
<!-- 父bean必須是抽象bean或者定義lazy-init=true也就是不讓bean工廠例項化該bean abstract="true" Spring不會例項化該bean-->
<bean id="father" class="com.lyc.cn.v2.day01.parent.Father" abstract="true">
<property name="name" value="father name"/>
</bean>
<bean id="sun" class="com.lyc.cn.v2.day01.parent.Sun" parent="father">
<property name="name" value="sun name"></property>
<property name="age" value="18"/>
</bean>
3.測試
在上一章的測試類中新增測試用例。
@Test
public void test5() {
// 內部bean
Outer outer = xmlBeanFactory.getBean("outer", Outer.class);
outer.sayHello();
}
@Test
public void test6() {
// 父子bean
Sun sun = xmlBeanFactory.getBean("sun", Sun.class);
sun.sayHello();
}
4.結果
========測試方法開始=======
outer-->name:我是一個外部bean,age:20
inner-->name:我是一個內部bean,age:10
========測試方法結束=======
========測試方法開始=======
nage: father name(我是從parent Bean繼承過來的), age: 18
========測試方法結束=======
測試結果:
- 內部順利被例項化,其屬性值也注入進innerbean中。
- 父子bean中的子bean,也通過繼承parent bean,得到了name屬性。