美文网首页
Spring通过工厂方法配置bean

Spring通过工厂方法配置bean

作者: BlueSkyBlue | 来源:发表于2020-03-18 14:10 被阅读0次

    传统的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);
    }
    

    相关文章

      网友评论

          本文标题:Spring通过工厂方法配置bean

          本文链接:https://www.haomeiwen.com/subject/qbiqyhtx.html