Spring通过工厂方法配置bean

2020-03-18  本文已影响0人  BlueSkyBlue

传统的Spring配置bean的方式是通过全类名反射的机制。还可以通过工厂方法来配置bean。

这里的工厂方法分为静态工厂方法实例工厂方法

静态工厂方法

直接调用某一个类的静态方法就可以返回Bean的实例。通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例。

  1. 首先创建bean实体类
public class Car {
    public Car(){
        System.out.println("Car's constructor");
    }

    private String brand;

    public Car(String brand) {
        this.brand = brand;
    }

    public void setBrand(String brand) {
        System.out.println("Set brand.");
        this.brand = brand;
    }

    public void init(){
        System.out.println("init");
    }

    public void destroy(){
        System.out.println("destroy");
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                '}';
    }
}
  1. 创建静态工厂类
public class StaticCarFactory {
    private static Map<String, Car> cars = new HashMap<>();

    static {
        cars.put("Audi", new Car("Audi"));
        cars.put("BMW", new Car("BMW"));
        cars.put("Benz", new Car("Benz"));
    }

    public static Car getCar(String name){
        return cars.get(name);
    }
}
  1. 创建配置文件
<bean
        id="car1"
        class="com.spring.factory.StaticCarFactory"
        factory-method="getCar">
    <constructor-arg value="Audi"></constructor-arg>
</bean>

参数说明:
class属性:指向静态工厂方法的全类名。
factory-method:指向静态工厂方法的名字。
cosntructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数。

  1. 主函数调用
public static void main(String[] args) {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
    Car car1 = (Car)ctx.getBean("car1");
    System.out.println(car1);
}

实例工厂方法

需要创建工厂本身,再调用工厂的实例方法来返回bean的实例。

  1. 创建工厂本身
public class InstanceCarFactory {
    private Map<String, Car> cars = null;

    public InstanceCarFactory(){
        cars = new HashMap<>();
        cars.put("Audi", new Car("Audi"));
        cars.put("BMW", new Car("BMW"));
        cars.put("Benz", new Car("Benz"));
    }

    public Car getCar(String brand){
        return cars.get(brand);
    }
}
  1. 编写配置文件
<bean
        id="carFactory"
        class="com.spring.factory.InstanceCarFactory">
</bean>
  1. 通过实例工厂方法来配置bean
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
    <constructor-arg value="BMW"></constructor-arg>
</bean>
  1. 主函数调用
public static void main(String[] args) {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
    Car car2 = (Car)ctx.getBean("car2");
    System.out.println(car2);
}

FactoryBean

FactoryBean是Spring为我们提供的。有时候我们需要用到IOC容器中的其它bean。此时需要使用FactoryBean配置。

示例:
创建FactoryBean

public class CarFactoryBean implements FactoryBean {
    private String brand;

    public void setBrand(String brand) {
        this.brand = brand;
    }

    @Override
    public Car getObject() throws Exception {
        return new Car("BMW");
    }

    @Override
    public Class<?> getObjectType() {
        return Car.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

自定义的FactoryBean需要实现Spring提供的接口

  1. 编写配置文件
<bean id="car" class="com.spring.factorybean.CarFactoryBean">
    <property name="brand" value="BMW"></property>
</bean>

参数说明:
class:指向FactoryBean的全类名。
property:配置FactoryBean的属性。
但实际返回的确是FactoryBean的getObject方法返回的实例。

  1. 调用主函数
public static void main(String[] args) {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-beanfactory.xml");
    Car car = (Car)ctx.getBean("car");
    System.out.println(car);
}
上一篇下一篇

猜你喜欢

热点阅读