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>
  • 相关阅读:
    pysocketserver
    协程
    py模块和包
    py网络编程
    GridView绑定技巧终结者
    iOS 证书/私钥/代码签名/描述文件
    八拜之交
    POJ3230(Travel)
    POJ2553(The Bottom of a Graph)
    动态规划的实质
  • 原文地址:https://www.cnblogs.com/5588kjx/p/10156362.html
Copyright © 2011-2022 走看看