Spring 利用FactoryBean来配置Bean

12 篇文章 0 订阅

Spring 利用FactoryBean来配置Bean

在之前的 博文 已经介绍可以利用java反射机制 和 工厂方法(Factory Method)的方法来在bean config file里 配置beans

本文简单介绍下第三种方法 FactoryBean。

FactoryBean 用法可以与Factory Method有点类似,我们同样需要写1个工厂类, 只不过spring提供了1个叫做FactoryBean的接口。

我们的工厂类必须实现这个接口。

例子

我们首先写1个Car类
package com.home.factoryBean;

public class Car {
    private int id;
    private String name;
    private int price;

    @Override
    public String toString() {
        return "Car [id=" + id + ", name=" + name + ", price=" + price + "]";
    }

    public Car(){

    }

    public Car(int id, String name, int price) {
        super();
        this.id = id;
        this.name = name;
        this.price = price;
    }
}
接下来必须写1个工厂类CarBeanFactory
package com.home.factoryBean;

import org.springframework.beans.factory.FactoryBean;

public class CarBeanFactory implements FactoryBean<Car>{

    private int id;
    private String brand;

    public void setId(int id) {
        this.id = id;
    }

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

    @Override
    public Car getObject() throws Exception {
        return new Car(id, brand, 0);
    }

    @Override
    public Class<?> getObjectType() {
        return Car.class;
    }

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

}

首先上面这个工厂必须实现Spring提供的FactoryBean这个接口。
然后重写里面的3个方法

getObject() -> 这个就是你想利用工厂类生产的bean对象, 通常在里面new 1个 对象就ok
getObjectType() -> 你必须指明上面bean的对象的class
isSingleton() -> 这个方法决定了这个bean是否单例的。

bean 配置文件
<!-- 
  FactroyBean:
    * We should specify the full class name of Factory to the property "class="
    * Actually this bean will return the object from the method "getObject" of the Factory class.
 -->

<bean id="car1" class="com.home.factoryBean.CarBeanFactory">
  <property name="id" value="1"></property>
  <property name="brand" value="Ford"></property>
</bean>

里面bean的配置写法跟反射机制的十分类似。

但是一般利用反射机制的bean配置, class= 的值就是bean对象的全类名, 但是利用FactoryBean的方式中, class= 必须是工厂类的全类名。

一但这个工厂类实现了FactoryBean接口, 那么这个bean item 返回的就是它里面的getObject()方法return的对象。

client代码
package com.home.factoryBean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class FactoryBeanClient {
    public static void f(){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-FactoryBean.xml");
        Car car1 = (Car)ctx.getBean("car1");
        System.out.println(car1);
    }
输出结果
Jun 04, 2016 1:26:00 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@627e9505: startup date [Sat Jun 04 13:26:00 CST 2016]; root of context hierarchy
Jun 04, 2016 1:26:00 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [bean-FactoryBean.xml]
Car [id=1, name=Ford, price=0]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nvd11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值