Spring 三種實例化Bean的方式

Spring4共提供了三種實例化bean的方式,分別爲構造器實例化、靜態工廠實例化、動態方法實例化,

下面一一詳解:文章出自這裏!

公用使用的實體

package com.gditc.test.domain;

/**
 * 測試實體
 * 
 * @author JiangI
 */
public class Person {

	private String name;
	private Integer age;

	public Person() {
		super();
		System.out.println("無參構造器");
	}

	public Person(String name) {
		super();
		this.name = name;
		System.out.println("帶name參數的構造器:" + name);
	}

	public Person(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
		System.out.println("帶name及age參數的構造器" + name + ":" + age);
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}


方式一:

xml配置
<!-- 實例化方式一:構造器 -->
<!-- 無參構造器實例化 -->
<bean id="personNo" class="com.gditc.test.domain.Person"/>
	
<!-- 帶name參數的構造器實例化 -->
<bean id="personWithName" class="com.gditc.test.domain.Person">
	<constructor-arg name="name" value="username1"/>
</bean>
	
<!-- 帶name及age參數的構造器實例化 -->
<bean id="personWithNameAndAge" class="com.gditc.test.domain.Person">
	<constructor-arg name="name" value="username2"/>
	<constructor-arg name="age" value="22"/><!-- 注意這裏的value一定要和Person類屬性的age的類型一致,否則報錯 -->
</bean>


測試
/**
 * 無參構造器 正確運行條件:有一個無參構造器,否則報錯(無參構造器必須顯示寫出來)
*/
@Test
public void testPersonNo() {
	Resource resource = new ClassPathResource("beans-instance.xml");
	BeanFactory beanFactory = new XmlBeanFactory(resource);
	Person person = (Person) beanFactory.getBean("personNo");
	System.out.println(person);
}
	
/*
 * 帶name參數構造器 
 */
@Test
public void testPersonWithName() {
	Resource resource = new ClassPathResource("beans-instance.xml");
	BeanFactory beanFactory = new XmlBeanFactory(resource);
	Person person = (Person) beanFactory.getBean("personWithName");
	System.out.println(person);
}
	
/*
 * 帶name及age參數構造器
 */
@Test
public void testPersonWithNameAndAge() {
	Resource resource = new ClassPathResource("beans-instance.xml");
	BeanFactory beanFactory = new XmlBeanFactory(resource);
	Person person = (Person) beanFactory.getBean("personWithNameAndAge");
<span style="white-space:pre">	</span>System.out.println(person);
}
以上是構造器實例化方式, 這個方法比較實用,必須掌握!!!

方式二:靜態工廠

靜態工廠實例化方法需要另外建立一個工廠類
package com.gditc.test.domain;

/**
 * 靜態工廠實例化
 * @author JiangI
 *
 */
public class PersonStaticFactory {

<span style="white-space:pre">	</span>//無參
	public static Person createPersonInstance() {
		return new Person();
	}
	
	//有參
	public static Person createPersonInstance(String name) {
		return new Person(name);
	}
}
本工廠類提供兩個方法,分別對應帶參數、無參構造器。

xml配置
<!-- 實例化方式二:靜態工廠 -->
<!-- 無參數工廠創建方法 -->
<bean id="personStaticFactory" class="com.gditc.test.domain.PersonStaticFactory" factory-method="createPersonInstance"/>
<!-- 帶一參數工廠創建方法 -->
<bean id="personStaticFactoryWithName" class="com.gditc.test.domain.PersonStaticFactory" factory-method="createPersonInstance">
<span style="white-space:pre">	</span><constructor-arg name="name" value="username3"/>
</bean>

測試
/*
 * 無參靜態工廠方法構造 (無論工廠方法是什麼修飾符都可以)
 */
@Test
public void testStaticFacotyNo() {
	Resource resource = new ClassPathResource("beans-instance.xml");
	BeanFactory beanFactory = new XmlBeanFactory(resource);
	Person person = (Person) beanFactory.getBean("personDynamicFactory");
	System.out.println(person);
}
	
/*
 *帶name參數工廠方法構造 
 */
@Test
public void testStaticFacotyWithName() {
	Resource resource = new ClassPathResource("beans-instance.xml");
	BeanFactory beanFactory = new XmlBeanFactory(resource);
	Person person = (Person) beanFactory.getBean("personDynamicFactoryWithName");
	System.out.println(person);
}

方式三:動態工廠

與靜態工廠大同小異,動態工廠的方法爲非靜態
package com.gditc.test.domain;


/**
 * 動態工廠
 * @author JiangI
 *
 */
public class PersonDynamicFactory {


	//無參
	public Person dynamicCreatePerson() {
		return new Person();
	}
	
	//有參
	public Person dynamicCreatePersonWithName(String name) {
		return new Person(name);
	}
}

xml配置
<!-- 實例化方式三:動態工廠  -->
<!-- 無參數工廠創建方法 -->
<bean id="personDynamicFactory" class="com.gditc.test.domain.PersonDynamicFactory" factory-method="dynamicCreatePerson"/>

<!-- 帶一參數工廠創建方法 -->
<bean id="personDynamicFactoryWithName" class="com.gditc.test.domain.PersonDynamicFactory" factory-method="dynamicCreatePersonWithName">
	<constructor-arg name="name" value="username4"/>
</bean>

測試
/*
 * 無參動態工廠方法構造(無論工廠方法是什麼修飾符都可以)
*/
@Test
public void testDynamicFacoty() {
	Resource resource = new ClassPathResource("beans-instance.xml");
	BeanFactory beanFactory = new XmlBeanFactory(resource);
	Person person = (Person) beanFactory.getBean("personDynamicFactory");
	System.out.println(person);
}
	
/*
 * 帶name參數的工廠構造(無論工廠方法是什麼修飾符都可以)
 */
@Test
public void testDynamicFacotyWithName() {
	Resource resource = new ClassPathResource("beans-instance.xml");
	BeanFactory beanFactory = new XmlBeanFactory(resource);
	Person person = (Person) beanFactory.getBean("personDynamicFactoryWithName");
	System.out.println(person);
}
動態工廠實例化的方式出現錯誤,暫時找不到原因










 

發佈了32 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章