FactoryBean:
这个接口使你可以提供一个复杂的逻辑来生成 Bean。它本质是一个 Bean,但这个 Bean 不是用来注 入到其它地方像 Service、Dao 一样使用的,它是用来生成其它 Bean 使用的。实现了这个接口后, Spring 在容器初始化时,把实现这个接口的 Bean 取出来,使用接口的 getObject()方法来生成我们 要想的 Bean。当然,那些生成 Bean 的业务逻辑也要写 getObject()方法中。 其返回的对象不是指定类的一个实例,其返回的是该工厂 Bean 的 getObject 方法所返回的对象。创 建出来的对象是否属于单例由 isSingleton 中的返回决定。
使用场景:
1、通过外部对类是否是单例进行控制,该类自己无法感知
2、在创建 Object 对象之前进 行初始化的操作,在 afterPropertiesSet()中完成。(一次性的初始化,保存在成员变量中,并不是 每次 getObject 都会调用 afterPropertiesSet,afterPropertiesSet 只会被调用一次)
ObjectFactory:
它的目的也是作为一个工厂,来生成 Object(这个接口只有一个方法 getObject())。这个接口一般被 用来,包装一个 factory,通过个这工厂来返回一个新实例(prototype 类型)。这个接口和 FactoryBean 有点像,但 FactoryBean 的实现是被当做一个 SPI(Service Provider Interface)实例来使用在 BeanFactory 里面;ObjectFactory 的实现一般被用来注入到其它 Bean 中,作为 API 来使用。就像ObjectFactoryCreatingFactoryBean 的 例 子 , 它 的 返 回 值 就 是 一 个 ObjectFactory , 这 个 ObjectFactory 被注入到了 Bean 中,在 Bean 通过这个接口的实例,来取得我们想要的 Bean。
总的来说,FactoryBean 和 ObjectFactory 都是用来取得 Bean,但使用的方法和地方不同, FactoryBean 被配置好后,Spring 调用 getObject()方法来取得 Bean,ObjectFactory 配置好后, 在 Bean 里面可以取得 ObjectFactory 实例,需要我们手动来调用 getObject()来取得 Bean。