FactoryBean 在 loveqq 与 spring 框架上的特性差异

23 阅读2分钟

FactoryBean 是一个强大的接口,可以用于批量生成一些特定的 bean。

loveqq-framework 和 spring 都对其有相应的支持,具体有哪些差异呢?

一、作用域配置不同

spring 中,当 @Scope 注解在一个 FactoryBean 上时,作用域是设置给该 FactoryBean 本身了,而不是设置给了所生产的 bean。

loveqq 中则不同,当 @Scope 注解在 FactoryBean 上时,作用域是设置给该 FactoryBean 生产的 bean 了,至于 FactoryBean 本身的作用域,则依赖 FactoryBean#isSingleton 的返回值,当返回 true 时,则是单例,否则和其生产的 bean 的作用域相同。

这样的好处是什么?显然,好处就是可以给生产的 bean 方便的设置作用域,比如使用 FactoryBean 生产一个 refresh 作用域的 bean!

而这个在 spring 中则只能给 FactoryBean 本身设置 refresh 作用域,但是此时将导致 FactoryBean#isSingleton 失效,原因请看第二个不同点。

 

二、FactoryBean#isSingleton 的含义不同

spring 中,FactoryBean#isSingleton 表示了该 FactoryBean 所生产的 bean 是否是单例。
因此,当 FactoryBean#isSingleton 返回 false 时,则生产的 bean 不是单例
当 FactoryBean#isSingleton 返回 true 时,则生产的 bean 也不一定是单例,因为此时还要看 FactoryBean 本身的作用域

  • 当 FactoryBean 本身是非单例时,则 FactoryBean#isSingleton 将失效,因此生产的 bean 不是单例!!!
    除此之外,还有一个重要问题,这种情况下,每次调用生产的 bean 的方法,都会重新调用 FactoryBean#getObject 创建新的实例来执行!!!

    loveqq 中则完全不同,FactoryBean#isSingleton 表示了 FactoryBean 本身是否是单例的,更确切的说,是表示是否使用相同的 FactoryBean 实例来生产 bean。
    因此,当 FactoryBean#isSingleton 返回 true 时,FactoryBean 本身是单例,则总是使用相同的 FactoryBean 实例去生产 bean,即使生产的 bean 不一定是单例
    当 FactoryBean#isSingleton 返回 false 时,FactoryBean 本身不是单例,但是生产的 bean 可能是单例,也可能不是单例,具体依赖设置的作用域

  • 实际上,当生产的 bean 是单例时,则 FactoryBean 是不是单例没有区别,因为只会调用一次
    当生产的 bean 不是单例时,则会使用不同的 FactoryBean 实例去生产

三、生产的 bean 的生命周期不同

spring 中,在我的测试下,生产的 bean 的生命周期并没有被 spring 管理,配置无法注入、依赖无法注入、初始化回调也没有

loveqq 中,生产的 bean 具有完整的生命周期

 

你觉得那种设计更好呢?欢迎讨论。