1. 程式人生 > >(11)Spring學習記錄---Spring_bean(靜態,例項工廠與FactoryBean建立Bean)

(11)Spring學習記錄---Spring_bean(靜態,例項工廠與FactoryBean建立Bean)

通過靜態工廠方法建立bean

1.Car.class 

private String band;
	private double price;
	
	
	public Car(String band, double price) {
		super();
		this.band = band;
		this.price = price;
	}
	
	@Override
	public String toString() {
		return "Car [band=" + band + ", price=" + price + "]";
	}

2.bean-factory.xml

<!-- 通過靜態工廠方法配置bean 配置bean的例項而不是靜態工廠類的例項 -->
	<!-- 
		class:指向靜態工廠方法的全類名
		factory-method:指向靜態方法的類名
		constructor-arg:如果工廠方法需要值,使用constructor-arg配置引數
	 -->
	<bean id="car" class="jjh.test.factory.StaticCarFactory" factory-method="getCar">
		<!-- 通過構造方法注入值 -->
		<constructor-arg value="audi"></constructor-arg>
	</bean>

3.StaticCarFactory.class

/**
 * 靜態工廠方法:直接呼叫一個類的靜態方法就可以返回bean的例項
 * **/
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);
	}
}	

 

4.結果

 

 通過使用例項工廠方法建立bean

1.InstanceCarFactory .class

/**
  *   例項工廠方法:通過建立例項工廠方法,在呼叫工廠的方法來獲取bean例項
 * **/

public class InstanceCarFactory {

	private Map<String, Car> cars=null;
	
	public InstanceCarFactory() {
		super();
		cars=new HashMap<String, Car>();
		cars.put("audi",new Car("audi", 400000));
		cars.put("ford",new Car("ford", 300000));
	}
	
	public Car getCar(String name) {
		return cars.get(name);
	}
	
}

2.bean-factory.xml

<!-- 配置工廠例項 -->
	<bean id="carFactory" class="jjh.test.factory.InstanceCarFactory"></bean>
	
	<bean id="car2" factory-bean="carFactory" factory-method="getCar">
		<!-- 通過構造方法注入值 -->
		<constructor-arg value="ford"></constructor-arg>
	</bean>

 3.結果

通過FactoryBean返回例項

1.CarFactoryBean.class

//自定義FactoryBean方法
public class CarFactoryBean implements FactoryBean<Car>{
	
	private String band;
	
	public void setBand(String band) {
		this.band = band;
	}

	@Override
	public Car getObject() throws Exception {
		return new Car(band, 400000);
	}

	@Override
	public Class<?> getObjectType() {
		// TODO Auto-generated method stub
		return null;
	}
	
	//	是否單例模式
	@Override
	public boolean isSingleton() {
		// TODO Auto-generated method stub
		return true;
	}

}

2.factory-bean.xml

<!-- 
		通過factoryBean 來配置bean
		class:指向factoryBean的全類名
		property:配置屬性
		
		通過 factoryBean 的getObject方法返回bean的例項
	 -->
	<bean id="car3" class="jjh.test.factory.CarFactoryBean">
		<property name="band" value="audi"></property>
	</bean>

 3.結果