FactoryBean的使用

FactoryBean的使用

​ 一般情况下,Spring通过反射机制利用用户指定的class来实例化Bean,但有的情况下实例化Bean过程比较复杂,如果使用需要大量配置,或者使用@Bean在注释方法中需要写大量代码。Spring为此给我们提供了一个org.springframework.bean.factory.FactoryBean<T>的工程类接口,用户可以实现该接口用于实例化一个类的逻辑,然后把实现FactoryBean的类交个Spring。

public interface FactoryBean<T> {
    boolean isSingleton(); //由FactoryBean创建的bean是 singleton还是prototype

    Class<?> getObjectType(); //获取FactoryBean创建的bean类型

    T getObject() throws Exception; //返回FactoryBean创建的bean实例,如果isSingleton()返回为true,则该实例会被放到Spring单例缓冲池中
}

注意:

​ 当我们注册一个FactoryBean类型到Spring容器中后,再去获取FactoryBean对应bean时,返回的类型不是FactoryBean,而是FactoryBean创建的对象,如果要获取FactoryBean本身,那要加上前缀&.

class Dog{
    public String name = "dog";
}

//实现FactoryBean接口,用于创建Dog的bean
class DogFactoryBean implements FactoryBean<Dog>{
    @Override
    public Dog getObject() throws Exception {
        return new Dog();
    }
    @Override
    public Class<?> getObjectType() {
        return Dog.class;
    }
    @Override
    public boolean isSingleton() {
        return true;
    }
}

public class SpringDemo {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext
          = new AnnotationConfigApplicationContext();
        applicationContext.register(DogFactoryBean.class); //注册一个FactoryBean类型
        applicationContext.refresh();

        //获取刚刚注册的DogFactoryBean,实际返回的是DogFactoryBean创建的Dog
        Object dog = applicationContext.getBean("dogFactoryBean");
        System.out.println(dog);// 打印结果com.example.Dog@480bdb19

        //加上&就可以获取刚刚注册的DogFactoryBean
        Object dogFactoryBean = applicationContext.getBean("&dogFactoryBean");
        System.out.println(dogFactoryBean);// 打印结果com.example.DogFactoryBean@2a556333
    }
}
时间: 2024-09-03 11:44:49

FactoryBean的使用的相关文章

Spring2.0技巧之活用FactoryBean

技巧 Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean.工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象.在Spring框架内部,AOP相关的功能及事务处理中,很多地方使用到工厂Bean,本文简单分析工厂Bean的用法. 首先回顾一下普通Bean,普通的Bean直接返回指定类(配置中的class属性的值)的一个实例,如下面的bean1将返回一个String字符串:

Spring 2.0技巧之活用FactoryBean

Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean.工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象.在Spring框架内部,AOP相关的功能及事务处理中,很多地方使用到工厂Bean,本文简单分析工厂Bean的用法. 首先回顾一下普通Bean,普通的Bean直接返回指定类(配置中的class属性的值)的一个实例,如下面的bean1将返回一个String字符串: <be

用FactoryBean让Spring配置动起来

看到不少朋友讨论 spring 配置时认为 spring 配置中只能静态的设置一些参数(典型情况如数据库配置, 定时器配置等)导致不方便, 其实 spring 已经提供了非常便利的方式来实现动态配置, 我们要做的只是实现一个自己的 FactoryBean , 来看一下 FactoryBean 接口的定义 代码 /** * Interface to be implemented by objects used within a BeanFactory * that are themselves f

InitializingBean,FactoryBean详解

Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean.工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象.创建出来的对象是否属于单例由isSingleton中的返回决定.使用场景:1.通过外部对类是否是单例进行控制,该类自己无法感知 2.对类的创建之前进行初始化的操作,在afterPropertiesSet()中完成. Spring初始化bean的时候,如果bean实现了

Spring之FactoryBean

首先要分辨BeanFactory 与 FactoryBean的区别, 两个名字很像,所以容易搞混 BeanFactory: 以Factory结尾,表示它是一个工厂类,是用于管理Bean的一个工厂 FactoryBean:以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean<T>接口的Bean,根据该Bean的Id从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身, 如果要获

factorybean-自定义实现spring的FactoryBean的问题?

问题描述 自定义实现spring的FactoryBean的问题? 网上的例子都是直接实现FactoryBean接口自带的方法,能不能在自定义的工厂bean里添加自己的方法?一般spring都是返回的是bean而非工厂bean,如果自定义方法的话返回bean就没法访问到,不知道大家是怎么设计的,是FactoryBean里只写接口的那些实现不自定义方法,需要的方法都放到dao里写? 比如在自定义的factorybean里实现了默认的public abstract T getObject(),publ

《Spring攻略(第2版)》——1.7 使用Spring的FactoryBean创建Bean

1.7 使用Spring的FactoryBean创建Bean 1.7.1 问题你可能希望用Spring的工厂Bean在Spring IoC容器中创建Bean.工厂Bean(Factory bean)是作为创建IoC容器中其他Bean的工厂的一个Bean.概念上,工厂Bean与工厂方法非常类似,但是它是Bean构造期间可被Spring IoC容器识别的Spring专用Bean. 1.7.2 解决方案工厂Bean的基本要求是实现FactoryBean接口.为了方便,Spring提供了抽象模板类Abs

Spring源码学习之:FactoryBean的使用

转载:http://book.51cto.com/art/201311/419081.htm ==========个人理解========================= FactoryBean和BeanFactory的关系[1]FactoryBean:是一个接口,是一个用户自定义实现类实现该接口的A类.当ioc容器初始化完成后.BeanFactory(ioc容器)调用getBean("beanname")的时候,返回的bean不是A类对应的实例,而是A类getObject()方法返

jbpm4.4整合SSH 在tomcat中启动后控制台一直查询JBPM4_JOB表

问题描述 jbpm4.4整合SSH 在tomcat中启动后控制台一直查询JBPM4_JOB表 jbpm4.4整合SSH 在tomcat中启动后控制台一直查询JBPM4__JOB表,_这是正常现象吗,应该这么解决呢????求解答 解决方案 http://download.csdn.net/detail/freedomky/4300308 是不是有业务需要重复执行. 解决方案二: 不会呀 我只整合好了SSH还没什么都没做呢 知识启动了tomcat 我的applicationContext.xml: