Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, FactoryBean.

工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean get 方法所返回的对象

 

\"\"

 

car.java

package com.hzyc.spring.bean.factorybean;

/**
 * @author xuehj2016
 * @ : Car
 * @ProjectName spring01
 * @De ion: TODO
 * @date 2018/12/1710:30
 */
public class Car {
    private String brand;
    private double price;

    public String getBrand() {
        return brand;
    }

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

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public Car() {
        System.out.println(\"Car\'s Constructor...\");
    }

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

    @Override
    public String toString() {
        return \"Car{\" +
                \"brand=\'\" + brand + \'\\\'\' +
                \", price=\" + price +
                \'}\';
    }
}

carFactoryBean.java

package com.hzyc.spring.bean.factorybean;

import org.spring work.beans.factory.FactoryBean;

/**
 * @author xuehj2016
 * @ : CarFactoryBean
 * @ProjectName Spring
 * @De ion: 自定义的 FactoryBean 需要实现 FactoryBean 接口
 * @date 2018/12/18 15:00
 */
public class CarFactoryBean implements FactoryBean {

    private String brand;

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

    /**
     * 返回 bean 的对象
     */
    @Override
    public Car get () throws Exception {
        return new Car(brand,450000);
    }

    /**
     * @return 返回 bean 的类型
     */
    @Override
    public Class<?> get Type() {
        return Car.class;
    }

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

bean-factorybean.

<?  version=\"1.0\" encoding=\"UTF-8\"?>
<beans  ns=\"http://www.spring work.org/schema/beans\"
        ns:xsi=\"http://www.w3.org/2001/ Schema-instance\"
       xsi:schemaLocation=\"http://www.spring work.org/schema/beans http://www.spring work.org/schema/beans/spring-beans.xsd\">

    <!--
        通过 FactoryBean 来配置 bean 的实例
        class : 指向 FactoryBean 的全类名
        property : 配置 FactoryBean 的属性

        但实际返回的实例确是 FactoryBean 的 get () 方法返回的实例!
    -->
    <bean id=\"car\" class=\"com.hzyc.spring.bean.factorybean.CarFactoryBean\">
        <property name=\"brand\" value=\"奥迪\"/>
    </bean>
</beans>

Main.java

package com.hzyc.spring.bean.factorybean;

import org.spring work.context.ApplicationContext;
import org.spring work.context.support.ClassPath ApplicationContext;

/**
 * @author xuehj2016
 * @ : Main
 * @ProjectName spring01
 * @De ion: TODO
 * @date 2018/12/1618:01
 */
public class Main {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPath ApplicationContext(\"bean-factorybean. \");

        Car car = (Car) applicationContext.getBean(\"car\");
        System.out.println(car);

    }
}

 

收藏 打印