5. Spring IoC工厂方法创建对象

IoC是典型的工厂模式,IoC通过工厂模式创建bean有两种方式:

静态工厂方法

创建Car类

package com.southwind.entity;

public class Car {
    private int num;
    private String brand;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getBrand() {
        return brand;
    }

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

    @Override
    public String toString() {
        return "Car{" +
                "num=" + num +
                ", brand='" + brand + '\'' +
                '}';
    }

    public Car(int num, String brand) {
        this.num = num;
        this.brand = brand;
    }
}

创建静态汽车工厂类,StaticCarFactory,在静态static代码块中初始化保存car对象的carMap,以便在getCar()方法中通过id来取car对象

package com.southwind.factory;

import com.southwind.entity.Car;

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

public class StaticCarFactory {
    private static Map<Integer, Car> carMap;
    static {
        carMap = new HashMap<>();
        carMap.put(1,new Car(1,"奥迪"));
        carMap.put(2,new Car(2,"宝马"));
    }

    public static Car getCar(int num){
        return carMap.get(num);
    }
}

在spring.xml中配置静态工厂类的bean

<!-- 配置静态工厂创建Car对象 -->
<bean id="car" class="com.southwind.factory.StaticCarFactory" factory-method="getCar">
    <constructor-arg value="2"></constructor-arg>
</bean>

实例工厂方法

创建实例汽车工厂类,InstanceCarFactory,与静态工厂类初始化不同,我们需要在无参构造函数中初始化carMap。

package com.southwind.factory;

import com.southwind.entity.Car;

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

public class InstanceCarFactory {
    private Map<Integer, Car> carMap;
    public InstanceCarFactory(){
        carMap = new HashMap<>();
        carMap.put(1,new Car(1,"奔驰"));
        carMap.put(2,new Car(2,"宝马"));
    }

    public Car getCar(int num){
        return carMap.get(num);
    }
}

在spring.xml中的配置

<!-- 配置实例工厂对象 -->
<bean id="instanceCarFactory" class="com.southwind.factory.InstanceCarFactory"></bean>

<!-- 通过实例工厂对象获取Car对象 -->
<bean id="car" factory-bean="instanceCarFactory" factory-method="getCar" >
    <constructor-arg value="1"></constructor-arg>
</bean>

总结

对比两种方式的区别,静态工厂方法的方式获取Car对象,不需要实例化工厂对象,因为静态工厂的静态方法不需要创建对象即可调用,所以spring.xml中只需要配置一个Car bean,不需要配置Factory bean。

实例工厂方法获取Car对象,必须先实例化工厂对象,因为调用的是非静态(实例)方法,必须通过实例化对象来调用方法,不能之间通过类来调用,所以spring.xml中需要先配置Factory bean,再配置Car bean。

Last updated

Was this helpful?