-->

Spring中Bean的配置方式之通过工厂方法

2020-02-19 05:53发布

通过调用静态工厂方法创建Bean

  调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节.

  要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名称. 最后, 使用 <constrctor-arg> 元素为该方法传递方法参数.

相关代码:

Car.java

private String brand;

private double price;

StaticCarFactory.java

public class StaticCarFactory {
    
        private static Map<String, Car> cars=new HashMap<String,Car>();
        
        static{
            cars.put("audi", new Car("audi",300000));
            cars.put("ford", new Car("ford",400000));
        }
        //静态工厂方法
        public static Car getCar(String name){
            return cars.get(name);
        }
}

bean-factory.xml

<!-- 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例 -->
    <!-- 
        Class属性:指向静态工厂方法的全类名
        factory-method:指向静态工厂方法的名字
        constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
     -->
<bean id="car1" class="com.yslf.factory.StaticCarFactory" factory-method="getCar">
    <constructor-arg value="ford"></constructor-arg>
</bean>

通过调用实例工厂方法创建Bean

  实例工厂方法: 将对象的创建过程封装到另外一个对象实例的方法里. 当客户端需要请求对象时, 只需要简单的调用该实例方法而不需要关心对象的创建细节.
  要声明通过实例工厂方法创建的 Bean
  在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean
  在 factory-method 属性里指定该工厂方法的名称
  使用 construtor-arg 元素为工厂方法传递方法参数

相关代码:

InstaceCarFactory.java

public class InstaceCarFactory {
    
    private static Map<String, Car> cars=null;
    
    public InstaceCarFactory() {
        
        cars=new HashMap<String,Car>();
        cars.put("audi", new Car("audi",300000));
        cars.put("ford", new Car("ford",400000));
    }
    
    public  Car getCar(String brand){
        
        return cars.get(brand);
    }
}

 

bean-factory.xml

<!-- 配置实例工厂方法来配置bean -->
    <!-- 
        factory-bean属性:指向静态工厂方法的bean
        factory-method:指向静态工厂方法的名字
        constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
     -->
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
    <constructor-arg value="audi"></constructor-arg>
</bean>

Main.java

public class Main {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("bean-factory.xml");
        Car car1=(Car) context.getBean("car1");
        System.out.println(car1);
        
        Car car2=(Car) context.getBean("car2");
        System.out.println(car2);
    }
}

 

标签: