Spring通過工廠方法配置 Bean

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

	<!-- 
		通過靜態工廠方法配置bean,注意不是配置靜態工廠方法實例,而是配置bean實例
		
		class屬性:指向靜態工廠方法的全類名
		factory-method:指向靜態工廠方法的名字
		constructor-arg:如果工廠方法需要傳入參數,則使用constructor-arg配置參數
	 -->
	<bean id="car" class="com.lh.factorybean.config.StaticCarFactory" factory-method="createCar">
		<constructor-arg><value>ford</value></constructor-arg>
	</bean>
package com.lh.factorybean.config;

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

import com.lh.factorybean.bean.Car;

/** 
* @ClassName: StaticCarFactory 
* @Description: Car靜態工廠類,直接調用某一個類的靜態方法就可以返回bean的實例
* @author Liu 
* @date 2018年6月1日 下午10:12:08 
*/
public class StaticCarFactory {
	private static Map<String, Car> map = new HashMap<>();
	
	static {
		map.put("audi",new Car("Audi", 300000.0));
		map.put("ford",new Car("Ford", 400000.0));
	}
	
	//靜態工廠方法
	public static Car createCar(String name) {
		return map.get(name);
	}
}
package com.lh.factorybean.bean;

/**
 * @ClassName: Car
 * @Description: Car定義
 * @author Liu
 * @date 2018年6月1日 下午9:22:17
 */
public class Car {
	private String brand;

	private Double price;

	public Car() {
		super();
	}

	public Car(String brand, Double price) {
		this.brand = brand;
		this.price = price;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "Car [brand=" + brand + ", price=" + price + "]";
	}

}

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

package com.lh.factorybean.config;

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

import com.lh.factorybean.bean.Car;

/** 
* @ClassName: InstanceCarFactory 
* @Description: 實例工廠的方法創建bean,即先需要創建工廠本身,再調用工廠的實例方法返回bean的實例
* @author Liu 
* @date 2018年6月1日 下午10:31:45 
*/
public class InstanceCarFactory {
	private Map<String, Car> map = null;

	public InstanceCarFactory() {
		map = new HashMap<>();
		map.put("audi", new Car("Audi", 300000.0));
		map.put("ford", new Car("Ford", 400000.0));
	}
	
	public Car createCar(String name) {
		return map.get(name);
	}
}
	<!-- 配置工廠的實例 -->
	<bean id="carFactory" class="com.lh.factorybean.config.InstanceCarFactory"/>
	
	<!-- 通過實例工廠方法來配置bean -->
	<!-- 
		通過靜態工廠方法配置bean,注意不是配置靜態工廠方法實例,而是配置bean實例
		
		factory-bean屬性:指向實例工廠方法的bean引用
		factory-method:指向實例工廠方法的名字
		constructor-arg:如果工廠方法需要傳入參數,則使用constructor-arg配置參數
	 -->
	<bean id="car2" factory-bean="carFactory" factory-method="createCar">
		<constructor-arg><value>audi</value></constructor-arg>
	</bean>

三、輸出

package com.lh.factorybean;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/** 
* @ClassName: Main 
* @Description: TODO
* @author Liu 
* @date 2018年6月1日 下午9:30:37 
*/
public class Main {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factorybean.xml");
		
		System.out.println(ctx.getBean("car"));
		
		System.out.println(ctx.getBean("car2"));
		
		ctx.close();
	}

}
Car [brand=Ford, price=400000.0]//靜態工廠方法
Car [brand=Audi, price=300000.0]//實例工廠方法

 

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