FactoryBean 在 loveqq 与 spring 框架上的特性差异
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 具有完整的生命周期。
你觉得那种设计更好呢?欢迎讨论。