通过静态工厂方法创建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.结果