FactoryBean在Spring框架与loveqq平台上的特性差异解析
FactoryBean在Loveqq框架与Spring框架上的特性差异主要体现在以下几个方面:两者在创建对象的方式上有所不同,FactoryBean在Spring框架中是一个特殊的Bean,用于创建其他Bean实例,而在Loveqq框架中可能具有不同的实现方式,两者在依赖注入和配置管理方面的灵活性也有所差异,Spring框架中的FactoryBean还具有工厂模式特性,允许更灵活的组件管理和依赖注入方式,而Loveqq框架中的特性可能更侧重于其他方面,如性能优化等,总体而言,两者在FactoryBean特性上的差异主要体现在创建对象的方式、依赖注入和配置管理的灵活性以及框架的特定功能等方面。


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 是否为单例。
- 若返回
false,则每次获取 Bean 都会调用getObject()创建新实例; - 若返回
true,所创建的 Bean 也不一定真正是单例——还需结合 FactoryBean 自身的作用域判断; - 当 FactoryBean 本身是非单例(如
@Scope("prototype"))时,isSingleton()将被忽略,此时即使返回true,所创建的 Bean 仍非单例; - 更严重的是:每次调用该 Bean 的方法时,Spring 都会重新创建一个新的实例来执行!
loveqq 则采用更清晰的设计:isSingleton() 表示 FactoryBean 实例自身是否为单例,即是否复用同一个 FactoryBean 实例来生成目标 Bean。
- 返回
true:始终使用同一 FactoryBean 实例执行getObject(),无论目标 Bean 是否单例; - 返回
false:每次都会新建 FactoryBean 实例来生成目标 Bean,而目标 Bean 的单例性仍由其作用域控制; - 若目标 Bean 是单例,则无论 FactoryBean 是否单例,
getObject()仅被调用一次; - 若目标 Bean 非单例,则会按需创建多个 FactoryBean 实例进行生产。
三、目标 Bean 的生命周期管理能力不同
根据实测,在 Spring 中,FactoryBean 所创建的 Bean 并未纳入完整的 IoC 生命周期管理:
- 无法自动注入配置属性(
@Value、@ConfigurationProperties等失效); - 依赖注入(
@Autowired)不可用; - 初始化回调(如
InitializingBean#afterPropertiesSet、@PostConstruct)不会触发。
而在 loveqq 中,FactoryBean 创建的 Bean 享有完整生命周期支持:
- 支持字段/构造器/Setter 注入;
- 可正确解析并注入配置;
- 初始化与销毁回调均可正常执行;
- 完全兼容 AOP、代理、作用域扩展等高级特性。
你更倾向哪一种设计?欢迎留言交流。
源码地址:点击下载
网友留言(0 条)