Spring中通過工廠方法配置bean

Spring中通過工廠方法配置bean


一、通過靜態工廠方法來配置bean

1、說在前面

(1)調用靜態工廠方法創建 Bean是將對象創建的過程封裝到靜態方法中。當客戶端需要對象時, 只需要簡單地調用靜態方法, 而不同關心創建對象的細節。
(2)要聲明通過靜態方法創建的 Bean, 需要在 Bean 的 class 屬性裏指定擁有該工廠的方法的類, 同時在 factory-method 屬性裏指定工廠方法的名稱。最後,使用 <constrctor-arg> 元素爲該方法傳遞方法參數。

2、實例演示

Car類:

package com.at.beans.factory;

public class Car {

	private String brand;
	private double price;
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "Car [brand=" + brand + ", price=" + price + "]";
	}
	public Car(String brand, double price) {
		super();
		this.brand = brand;
		this.price = price;
	}
}


StaticCarFactory類:

package com.at.beans.factory;

import java.util.HashMap;
import java.util.Map;

/**
 * 靜態工廠方法:直接調用某一個類的靜態方法就可以返回bean的實例
 * @author LI AO
 *
 */
public class StaticCarFactory {

	private static Map<String,Car> cars = new HashMap<String, Car>();
	
	static{
		cars.put("Audi", new Car("Audi", 400000));
		cars.put("Ford", new Car("Ford", 300000));
	}
	
	public static Car getCar(String name){
		return cars.get(name);
	}
}


配置bean:

	<!-- 通過靜態工廠方法來配置bean,注意不是配置靜態工廠方法實例,而是配置bean的實例 -->
	<!-- 
	 	class屬性:指向靜態工廠方法的全類名
	 	factory-method:指向靜態工廠方法的名稱
	 	constructor-arg:如果靜態工廠方法需要傳入參數,則使用constructor-arg來配置參數
	 -->
	<bean id="car1" class="com.at.beans.factory.StaticCarFactory" factory-method="getCar">
		<constructor-arg value="Audi"></constructor-arg>
	</bean>


測試函數:

		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
		Car car1 = (Car) ctx.getBean("car1");
		System.out.println(car1);


返回結果:

六月 01, 2017 3:42:45 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a5f39b0: startup date [Thu Jun 01 15:42:45 CST 2017]; root of context hierarchy
六月 01, 2017 3:42:45 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans-factory.xml]
Car [brand=Audi, price=400000.0]



二、通過實例工廠方法來配置bean

1、說在前面

(1)實例工廠方法: 將對象的創建過程封裝到另外一個對象實例的方法裏,當客戶端需要請求對象時,只需要簡單的調用該實例方法而不需要關心對象的創建細節。
(2)要聲明通過實例工廠方法創建的bean:
① 在 bean 的 factory-bean 屬性裏指定擁有該工廠方法的 Bean;
② 在 factory-method 屬性裏指定該工廠方法的名稱;
③ 使用 construtor-arg 元素爲工廠方法傳遞方法參數。

2、實例演示

Car類和靜態工廠方法中的一樣。
InstanceCarFactory類:

package com.at.beans.factory;

import java.util.HashMap;
import java.util.Map;

//實例工廠方法:實例工廠的方法:即需要先創建工廠本身,在調用工廠的實例方法來返回bean的實例
public class InstanceCarFactory {

	private Map<String, Car> cars = null;
	
	public InstanceCarFactory(){
		cars = new HashMap<String, Car>();
		cars.put("Audi",new Car("Audi",400000));
		cars.put("Ford",new Car("Ford",300000));
	}
	
	public Car getCar(String brand){
		return cars.get(brand);
	}
}

配置bean:

	<!-- 配置工廠的實例 -->
	<bean id="carFactory" class="com.at.beans.factory.InstanceCarFactory"></bean>
	<!-- 通過實例工廠方法來配置bean -->
	<!-- 
	 	class屬性:指向實例工廠方法的bean
	 	factory-method:指向實例工廠方法的名稱
	 	constructor-arg:如果實例工廠方法需要傳入參數,則使用constructor-arg來配置參數
	 -->
	<bean id="car2" factory-bean="carFactory" factory-method="getCar">
		<constructor-arg value="Ford"></constructor-arg>
	</bean>

測試函數

		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
		Car car2 = (Car) ctx.getBean("car2");
		System.out.println(car2);


返回結果:

六月 01, 2017 4:35:56 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1c49094: startup date [Thu Jun 01 16:35:56 CST 2017]; root of context hierarchy
六月 01, 2017 4:35:56 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans-factory.xml]
Car [brand=Ford, price=300000.0]


By luoyepiaoxue2014

微博地址:http://weibo.com/luoyepiaoxue2014 點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章