IoC 通过⼯⼚模式创建 bean 的⽅式有两种:
- 静态工厂方法
- 实例工厂方法
一、静态工厂方法
1、创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car {
private int id;
private String name;
}
2、创建静态工厂(在静态工厂的静态代码块中创建 目标对象 ,给一个静态方法用于获取 工厂中创建好的对象)
public class StaticFactory {
private static Map<Long, Car> carMap = new HashMap<Long, Car>();
static {
Car car1 = new Car(1,"大众");
Car car2 = new Car(2,"大奔");
carMap.put(1L,car1);
carMap.put(2L,car2);
}
public static Car getCar(Long l){
return carMap.get(l);
}
}
3、在bean.xml 中配置工厂(使用 factory-method
调用工厂中的getCar方法创建目标 bean。 使用constructor-arg
来设置 getCar 方法的参数)
<bean id="car" class="com.cl.factory.StaticFactory" factory-method="getCar">
<constructor-arg value="1"/>
</bean>
4、通过ApplicationContext对象从IoC容器中获取Bean
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
Car car = (Car) applicationContext.getBean("car");
System.out.println(car);
}
}
测试结果:
二、实例工厂方法
1、创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car {
private int id;
private String name;
}
2、创建实例工厂(在实例工厂中的无参构造方法中创建 目标对象,)
public class InstanceFactory {
private Map<Long, Car> carMap;
public InstanceFactory(){
carMap = new HashMap<Long, Car>();
Car car1 = new Car(1,"大众");
Car car2 = new Car(2,"大奔");
carMap.put(1L,car1);
carMap.put(2L,car2);
}
public Car getCar(Long l){
return carMap.get(l);
}
}
3、在bean.xml 中配置工厂(先配置实例工厂 bean,然后配置实例工厂创建 car。使用factory-bean
来关联实例工厂的bean;使用 factory-method
调用工厂中的getCar方法创建目标 bean;使用constructor-arg
来设置 getCar 方法的参数)
<!-- 配置实例工厂 bean -->
<bean id="instanceFactory" class="com.cl.factory.InstanceFactory"></bean>
<!-- 配置实例工厂创建 car -->
<bean id="car1" factory-bean="instanceFactory" factory-method="getCar">
<constructor-arg value="1"/>
</bean>
4、通过ApplicationContext对象从IoC容器中获取Bean
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
Car car = (Car) applicationContext.getBean("car1");
System.out.println(car);
}
}
测试结果: