Spring 中 IoC 通過⼯⼚模式建立 bean
阿新 • • 發佈:2021-01-07
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);
}
}
測試結果: