spring4.x征服SpringSpringFramework

使用FactoryBean自定义实例化逻辑

2016-05-14  本文已影响2842人  不迷失

Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean,这两种Bean都被容器管理,但工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该FactoryBean的getObject方法所返回的对象。在Spring框架内部,有很多地方有FactoryBean的实现类,它们在很多应用如(Spring的AOP、ORM、事务管理)及与其它第三框架(ehCache)集成时都有体现.

对象实现org.springframework.beans.factory.FactoryBean接口,则成为它本身的工厂。
FactoryBean接口是Spring IoC容器实例化逻辑的扩展点。假如初始化代码非常复杂,此时使用java编码比使用XML配置更容易表达。这种场景中,就可以自定义FactoryBean,在类中撰写复杂的初始化程序,并将其作为插件加入到容器中。

FactoryBean接口有3个方法:

Object getObject():返回本工厂创建的对象实例。此实例也许是共享的,依赖于该工厂返回的是单例或者是原型。
boolean isSingleton():如果FactoryBean返回的是单例,该方法返回值为true,否则为false
Class getObjectType():返回对象类型。对象类型是getObject()方法返回的对象的类型,如果不知道的类型则返回null。
FactoryBean概念和接口在Spring框架中大量使用。Spring内置的有超过50个实现。

当使用ApplicationContext的getBean()方法获取FactoryBean实例本身而不是它所产生的bean,则要使用&符号+id。比如,现有FactoryBean,它有id,在容器上调用getBean("myBean")将返回FactoryBean所产生的bean,调用getBean("&myBean")将返回FactoryBean它本身的实例。

package spring4;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

/**
 * Created by javajidi_com
 */
@Component("myFactoryBean")
public class MyFactoryBean implements FactoryBean<Compent> {
    public Compent getObject() throws Exception {
        return new Compent();//这里可以进行负责的对象创建逻辑
    }

    public Class<?> getObjectType() {
        return Compent.class;
    }

    public boolean isSingleton() {
        return true;//是否是单列
    }
}

package spring4;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * Created by javajidi_com
 */

public class Application {


    public static void main(String[] arg){
        //初始化spring容器,由于使用的是注解,没有xml文件,所有不再使用ClasspathXmlApplicationContext
        ApplicationContext context=new AnnotationConfigApplicationContext(Config.class);
        Object o1=context.getBean("myFactoryBean");
        Object o2=context.getBean("&myFactoryBean");
        System.out.println(o1.getClass());
        System.out.println(o2.getClass());
    }
}

输出
class spring4.Compent
class spring4.MyFactoryBean

微信公众号: javajidi_com
技术交流群: 245130488

上一篇 下一篇

猜你喜欢

热点阅读