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?