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>



posted @ 2018-06-12 19:17  惶者  阅读(168)  评论(0编辑  收藏  举报