zoukankan      html  css  js  c++  java
  • Spring通过工厂方法配置Bean

    1、静态工厂方法创建Bean

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

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

    package factory;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 静态工厂方法:直接用某一个类的静态方法就可以返回Bean的实例
     *
     * @author chenpeng
     * @date 2018/6/2 13:52
     */
    public class StaticCarFactory {
    
        private static Map<String,Car> cars = new HashMap<String, Car>();
    
        //静态块中进行初始化
        static {
            cars.put("Audi",new Car("Audi", (double) 30000));
            cars.put("大众",new Car("大众", (double) 20000));
        }
    
        //静态工厂方法
        public static Car getCar(String name){
            return cars.get(name);
        }
    }
    
    <!--
    通过静态工厂方法来配置Bean,注意不是配置静态工厂方法实例, 而是配置Bean实例
    class:指向静态工厂方法的全类名
    factory-method:静态工厂方法名
    constructor-arg:赋值,如果工厂方法需要传入参数,则使用constructor-arg来配置参数
    -->
    <bean id="car1" class="factory.StaticCarFactory" factory-method="getCar">
        <constructor-arg value="Audi"/>
    </bean>


    2、实例工厂方法创建Bean
    - 实例工厂方法:将对象的创建过程封装在另外一个对象实例的方法里。当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。

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

    package factory;
    
    import org.omg.Dynamic.Parameter;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 实例工厂方法:实例工厂的方法需要创建工厂本身,再调用工厂的实例方法来返回bean的实例
     *
     * @author chenpeng
     * @date 2018/6/2 14:10
     */
    public class InstanceCarFactory {
        private Map<String,Car> cars = null;
    
        public InstanceCarFactory() {
            cars = new HashMap<String, Car>();
            cars.put("Audi",new Car("Audi", (double) 30000));
            cars.put("大众",new Car("大众", (double) 20000));
        }
    
        public Car getCar(String brand){
            return cars.get(brand);
        }
    }
    
    <!--配置工厂的实例-->
    <bean id="carFactory" class="factory.InstanceCarFactory"/>
    <!--
    通过实例工厂方法来配置bean
    factory-bean:指向实例工厂方法的bean
    factory-method:静态工厂方法名
    constructor-arg:赋值,如果工厂方法需要传入参数,则使用constructor-arg来配置参数
    -->
    <bean id="car2" factory-bean="carFactory" factory-method="getCar">
        <constructor-arg value="大众"/>
    </bean>
    3、通过factoryBean返回Bean的实例
    package factoryBean;
    
    import org.springframework.beans.factory.FactoryBean;
    
    /**
     * 通过自定义的FactoryBean,需要实现FactoryBean接口
     *
     * @author chenpeng
     * @date 2018/6/2 14:37
     */
    public class CarFactoryBean implements FactoryBean<Car> {
        private String brand;
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
    
        /**
         *返回Bean的对象
         */
        public Car getObject() throws Exception {
            return new Car(brand, (double) 30000);
        }
    
        /**
         * 返回Bean的类型
         */
        public Class<?> getObjectType() {
            return Car.class;
        }
    
        //是否为单实例
        public boolean isSingleton() {
            return false;
        }
    }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    
        <!--
        通过FactoryBean来配置Bean的实例
        class:指向FactoryBean的全类名
        property:配置FactoryBean的属性
    
        但实际返回的却是FactoryBean的getObject()方法返回的实例
        -->
        <bean id="facoryBean" class="factoryBean.CarFactoryBean">
            <property name="brand" value="xxxx"/>
        </bean>
    </beans>



  • 相关阅读:
    EF Code First一对一、一对多、多对多关联关系配置
    ASP.NET MVC 3.0 HTML辅助方法
    CSS常用命名
    ExtJS3.4.0系列:ExtJS下载使用
    在HTTP响应标题中隐藏ASP.NET MVC的版本
    ASP.NET MVC动作过滤器
    Sql Server系列:使用TransactSQL编程
    ExtJS3.4.0系列:Ext.Panel
    Sql Server系列:Select检索数据
    ASP.NET MVC资源文件多语言实现方式
  • 原文地址:https://www.cnblogs.com/huangzhe1515023110/p/9276059.html
Copyright © 2011-2022 走看看