通过调用实例工厂方法创建 Bean
实例工厂方法: 将对象的创建过程封装到另外一个对象实例的方法里. 当客户端需要请求对象时, 只需要简单的调用该实例方法而不需要关心对象的创建细节.
要声明通过实例工厂方法创建的 Bean
在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean
在 factory-method 属性里指定该工厂方法的名称
使用 construtor-arg 元素为工厂方法传递方法参数
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 实例工厂配置bean
factroy-bean: 指定工厂bean
factroy-method:指定实例工厂方法.
-->
<bean id="iof" class="com.learn.spring.factory.InstanceObjectFactory"></bean>
<bean id="car1" factory-bean="iof" factory-method="getCar">
<constructor-arg value="bmw"></constructor-arg>
</bean>
</beans>
package com.learn.spring.factory;
import java.util.HashMap;
import java.util.Map;
import com.learn.spring.autowire.Car;
/**
* 获取Car对象的工厂.
* InstanceObjectFactory iof = new InstanceObjectFactory();
*
* Car car = iof.getCar("bmw");
*/
public class InstanceObjectFactory {
private Map<String,Car> cars = new HashMap<String,Car>();
public InstanceObjectFactory(){
cars.put("audi", new Car("Audi", 450000));
cars.put("bmw", new Car("bmw",550000));
}
/**
* 实例工厂方法
*/
public Car getCar(String carName){
return cars.get(carName);
}
}
package com.learn.spring.factory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.learn.spring.autowire.Car;
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("spring-factory.xml");
Car car1 =(Car) ctx.getBean("car1");
System.out.println(car1);
}
}