1. 程式人生 > >Spring——靜態工廠方法、例項工廠方法建立 Bean ?

Spring——靜態工廠方法、例項工廠方法建立 Bean ?

一、通過呼叫靜態工廠方法建立 bean:

利用靜態工廠方法可以把bean注入到IOC容器中。在XML檔案中配置bean時,要指定class的屬性為工廠的類;factory-method屬性指定工廠類中工廠方法,用於建立bean;constrctor-arg用於給工廠方法傳遞引數。

1、首先建立實體類Card.java

public class Card {

	/**
	 * 編號
	 */
	private String id;
	/**
	 * 卡號
	 */
	private String number;

	public Card() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Card(String id, String number) {
		super();
		this.id = id;
		this.number = number;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	@Override
	public String toString() {
		return "Card [id=" + id + ", number=" + number + "]";
	}

2、接著建立靜態工廠的類StaticFactory.java

public class StaticFactory {

	// 建立map集合
	public static Map<String, Card> map = new HashMap<>();

	// 靜態載入
	static {
		map.put("card1", new Card("11111", "12345"));
		map.put("card2", new Card("22222", "23456"));
	}

	// 獲取值的方法
	public static Card getCard(String name) {
		return map.get(name);
	}

}

3、接著建立applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">

<!--class要寫工廠的類;factory-method要寫工廠類中用於建立bean的方法-->
	<bean id="card1" class="com.zking.spring01.factory.StaticFactory"
		factory-method="getCard">
		<constructor-arg value="card1" />
	</bean>


</beans>

4、最後就是建立測試類TestAction.java

public class TestAction {

	/**
	 * 
	 * @Title: getBean
	 * @Description: 獲取一個bean
	 * @return void
	 */
	@org.junit.Test
	public void getBean() {

		// 2、及時載入,特點:初始化載入時,有多少個bean標籤,就建立多少個bean物件
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

		//得到實體物件
		Card card1 = (Card) applicationContext.getBean("card1");

		System.out.println("編號:" + card1.getId() + " 卡號:" + card1.getNumber());
	}

}

5、控制檯輸出的結果

編號:11111 卡號:12345

二、通過呼叫例項工廠方法建立 bean:

     例項化靜態工廠注入bean,需要先例項化一個工廠類,然後通過由例項化工廠物件中的一個方法來建立bean,並注入到容器中。     在bean的 factory-bean 屬性裡指定擁有該工廠方法的 Bean;在 factory-method 屬性裡指定該工廠方法的名稱;使用 construtor-arg 元素為工廠方法傳遞方法引數。  

1、建立實體類Card.java

2、建立例項工廠的類InstanceFactory.java

public class InstanceFactory {

	// 建立map集合
	private Map<String, Card> map = null;

	// 例項載入
	public InstanceFactory() {
		map = new HashMap<>();
		map.put("card1", new Card("11111", "12345"));
		map.put("card2", new Card("22222", "23456"));
	}

	// 獲取值的方法
	public Card getCard(String name) {
		return map.get(name);
	}
}

3、applicationContext.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">

	<!--例項化工廠方法的注入 -->
	<!-- 首先建立一個工廠的bean -->
	<bean id="cardFactory"
		class="com.zking.spring01.factory.InstanceFactory"></bean>
	<!-- factory-bean指定前面已經建立的bean; factory-method指定工廠例項中用於建立car的方法; constructor-arg指定建立car方法中傳入的引數 -->
	<bean id="card2" factory-bean="cardFactory"
		factory-method="getCard">
		<constructor-arg value="card2"></constructor-arg>
	</bean>

</beans>

4、建立測試類TestAction.java

public class TestAction {

	/**
	 * 
	 * @Title: getBean
	 * @Description: 獲取一個bean
	 * @return void
	 */
	@org.junit.Test
	public void getBean() {

		// 2、及時載入,特點:初始化載入時,有多少個bean標籤,就建立多少個bean物件
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

		Card	card2 = (Card) applicationContext.getBean("card2");
		// 得到card物件注入到測試表的屬性值
		System.out.println("編號:" + card2.getId() + " 卡號:" + card2.getNumber());
	}

}

5、控制檯輸出的結果

編號:22222 卡號:23456