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]//实例工厂方法

猜你喜欢

转载自my.oschina.net/Howard2016/blog/1822874