1. 內(nèi)部Bean(inner bean)
當希望一個bean只被某一個類使用時,我們可以使用內(nèi)部bean山析。內(nèi)部bean此時作為某一個類的屬性,只能通過該類實例化。
- bean
package com.lyc.cn.v2.day01.inner;
public class Outer {
/** 姓名 **/
private String name;
/** 年齡 **/
private int age;
/** 內(nèi)部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="我是一個內(nèi)部bean"></property>
<property name="age" value="10"></property>
</bean>
</property>
</bean>
2.父子bean
封裝、繼承躏率、多態(tài)是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() {
// 內(nèi)部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:我是一個內(nèi)部bean,age:10
========測試方法結束=======
========測試方法開始=======
nage: father name(我是從parent Bean繼承過來的), age: 18
========測試方法結束=======
測試結果:
- 內(nèi)部順利被實例化黄娘,其屬性值也注入進innerbean中峭状。
- 父子bean中的子bean,也通過繼承parent bean逼争,得到了name屬性优床。