Spring 中 IoC 通过⼯⼚模式创建 bean—05

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

测试结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Start1234567/article/details/112282312