學習Spring(七) -- Spring中的Factory用法

靜態工廠java

    首先,要有一個靜態工廠來生成對象,編寫一個Car類和一個StaticCarFactory類:spring

package cn.net.bysoft.lesson5;

public class Car {

    public Car() {

    }

    public Car(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Car [name=" + name + "]";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;

}

package cn.net.bysoft.lesson5;

import java.util.HashMap;
import java.util.Map;

public class StaticCarFactory {
    private static Map<String, Car> cars = new HashMap<String, Car>();

    static {
        cars.put("Audi", new Car("Audi"));
        cars.put("Ford", new Car("Ford"));
    }

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

    在spring的配置文件進行配置,讓spring幫咱們調用靜態工廠方法生成Car對象:less

<bean id="car1" class="cn.net.bysoft.lesson5.StaticCarFactory"
        factory-method="getCar">
        <constructor-arg value="Audi"></constructor-arg>
    </bean>

    能夠看到class不在是Car的全類名,而是靜態工廠的全類名,factory-method屬性指向的是工廠中生成Car的方法名稱,而這個方法有一個name參數,咱們經過constructor-arg元素進行傳參,傳送給靜態工廠方法一個Audi參數,要求工廠返回一個Car,名字是Audi,測試一下:ide

    @Test
    public void testStaticFactory() {
        Car car1 = (Car) ctx.getBean("car1");
        System.out.println(car1);
        /**
         * output:Car [name=Audi]
         * */
    }

實例工廠測試

    其實與靜態工廠的用法相似,建立一個實例工廠:this

package cn.net.bysoft.lesson5;

import java.util.HashMap;
import java.util.Map;

public class InstanceCarFactory {
    private Map<String, Car> cars = new HashMap<String, Car>();

    public InstanceCarFactory() {
        cars.put("Audi", new Car("Audi"));
        cars.put("Ford", new Car("Ford"));
    }

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

    修改一個配置文件:spa

    <bean id="carFactory" class="cn.net.bysoft.lesson5.InstanceCarFactory"></bean>
    <bean id="car2" factory-bean="carFactory" factory-method="getCar">
        <constructor-arg value="Ford"></constructor-arg>
    </bean>

    首先,在配置文件中定義一個實例工廠的bean,接着,Car對象的bean不須要指定class了,而是使用factory-bean屬性將實例工廠bean的id賦值到該屬性,在定義factory-method,也就是生成對象的方法名稱,給方法傳值與以前的靜態工廠同樣。要求工廠生成一個Ford汽車,測試一下結果:.net

    @Test
    public void testInstanceFactory() {
        Car car2 = (Car) ctx.getBean("car2");
        System.out.println(car2);
        /**
         * output:Car [name=Ford]
         * */
    }

內置的FactoryBeancode

    Spring爲咱們提供了一個FactoryBean接口,咱們能夠自定義工廠去實現這個接口:xml

package cn.net.bysoft.lesson5;

import org.springframework.beans.factory.FactoryBean;

public class CarFactoryBean implements FactoryBean<Car> {

    private String brand;

    public void setBrand(String brand) {
        this.brand = brand;
    }

    @Override
    public Car getObject() throws Exception {
        // TODO Auto-generated method stub
        return new Car(brand);
    }

    @Override
    public Class<?> getObjectType() {
        // TODO Auto-generated method stub
        return Car.class;
    }

    @Override
    public boolean isSingleton() {
        // TODO Auto-generated method stub
        return true;
    }

}

    這個接口只有三個方法:getObject、getObjectType和isSingleton,分別用來得到一個對象、得到這個對象的類型和這個對象是不是單例的。

    經過配置spring的配置文件,就能夠使用這個工廠:

    <bean id="car3" class="cn.net.bysoft.lesson5.CarFactoryBean">
        <property name="brand" value="BMW"></property>
    </bean>

    將要生成的對象的class指定FactoryBean的全類名,設置屬性,Spring會自動調用getObject()方法返回對象。

@Test
    public void testFactoryBean() {
        Car car3 = (Car) ctx.getBean("car3");
        System.out.println(car3);
        /**
         * output:Car [name=BMW]
         * */
    }
相關文章
相關標籤/搜索