1. 程式人生 > 其它 >Spring 中 IoC 通過⼯⼚模式建立 bean

Spring 中 IoC 通過⼯⼚模式建立 bean

技術標籤:Spring框架javaspring

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);
    }
}

測試結果:
在這裡插入圖片描述