您的位置:首页 > 编程语言 > Java开发

Spring-10:通过工厂方法配置Bean

2016-07-20 15:31 579 查看
本文介绍在Spring框架中通过工厂方法配置bean的两种方式:通过调用静态工厂方法创建Bean以及通过调用实例的工厂方法创建Bean。

首先准备一个Car类,该类有String brand 和 double price 两个属性,并定义get和set以及构造方法。

package com.atguigu.spring.beans.factory;

public class Car {
private String brand;
private double price;
Car(String brand, double price) {
this.brand = brand;
this.price = price;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + "]";
}

}


通过调用静态工厂方法创建 Bean

调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中。 当客户端需要对象时,只需要简单地调用静态方法, 而不用关心创建对象的细节。

要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名称。 最后, 使用 <constrctor-arg>
元素为该工厂方法传递参数。

示例如下:
创建拥有静态工厂方法的类:
package com.atguigu.spring.beans.factory;

import java.util.HashMap;

public class StaticCarFactory {

private static HashMap<String, Car> cars = new HashMap<String, Car>();

static {
cars.put("audi", new Car("audi", 300000));
cars.put("baoma", new Car("baoma", 500000));
}

public static Car getCar(String brand) {
return cars.get(brand);
}
}


这个 getCar 静态方法可以根据brand属性返回对应的实例。
在xml文件中配置如下:
<bean id="car1"
class="com.atguigu.spring.beans.factory.StaticCarFactory"
factory-method="getCar">
<constructor-arg value="audi"></constructor-arg>
</bean>
要注意:这里的class属性指向StaticCarFactory,并非Car,指定factory-method为getCar,将参数传递给该方法就可以得到对应的实例。

通过调用实例工厂方法创建 Bean

实例工厂方法: 将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时, 只需要简单的调用该实例方法而不需要关心对象的创建细节.

要声明通过实例工厂方法创建的 Bean,有三步:
0、配置拥有工厂方法的Bean

1、在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean
2、在 factory-method 属性里指定该工厂方法的名称
3、使用 construtor-arg 元素为工厂方法传递方法参数

创建拥有工厂方法的类:
package com.atguigu.spring.beans.factory;

import java.util.HashMap;

public class InstanceCarFactory {
private HashMap<String, Car> cars = null;

public InstanceCarFactory() {
cars = new HashMap<String, Car>();
cars.put("buk", new Car("buk",80000));
cars.put("ford", new Car("ford", 100000));
}

public Car getCar(String brand) {
return cars.get(brand);
}
}


在xml文件中分别配置工厂Bean和Car Bean:
<bean id="instanceCarFactory" class="com.atguigu.spring.beans.factory.InstanceCarFactory"></bean>
<bean id="car2"
class="com.atguigu.spring.beans.factory.Car"
factory-bean="instanceCarFactory"
factory-method="getCar">
<constructor-arg value="ford"></constructor-arg>
</bean>


这里car2的class属性指向Car,需要额外配置factory-bean属性指向刚才配置的 instanceCarFactory ,传入参数、得到实例。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息