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

来源:互联网 发布:kali linux是什么 编辑:程序博客网 时间:2024/04/28 08:39

本文介绍在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;}@Overridepublic 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 ,传入参数、得到实例。


0 0