
FactoryBean 是一个功能强大的接口,适用于批量创建特定类型的 Bean。
loveqq-framework 和 Spring 均提供了对 FactoryBean 的支持,但二者在实现细节上存在若干关键区别,具体如下:
一、作用域(Scope)配置逻辑不同
在 Spring 中,若将 @Scope 注解应用于 FactoryBean 类上,该作用域实际作用于 FactoryBean 实例本身,而非其 getObject() 方法所返回的目标 Bean。
而在 loveqq 中,@Scope 注解施加于 FactoryBean 上时,其作用域直接影响的是 FactoryBean 所创建的 Bean;FactoryBean 自身的作用域则由 FactoryBean#isSingleton() 方法的返回值决定:若返回 true,则 FactoryBean 为单例;否则,其作用域与所创建 Bean 的作用域保持一致。
这一设计的优势在于——开发者可直接通过注解为 FactoryBean 创建的 Bean 指定任意作用域(例如 refresh),操作简洁直观。
相比之下,在 Spring 中若想让 FactoryBean 创建出 refresh 作用域的 Bean,则必须将 @Scope("refresh") 应用于 FactoryBean 类上。但这会导致 FactoryBean#isSingleton() 失效,原因详见第二点。
二、FactoryBean#isSingleton() 方法语义不同
Spring 中,isSingleton() 方法的语义是:该方法返回值决定了其所创建的 Bean 是否为单例。
还木有评论哦,快来抢沙发吧~