天天看點

Spring中通過工廠方法配置bean一、通過靜态工廠方法來配置bean二、通過執行個體工廠方法來配置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[email protected]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[email protected]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 點選打開連結