1. 程式人生 > >05--Spring內部Bean和父子Bean

05--Spring內部Bean和父子Bean

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屬性。