Spring配置类创建Bean时能否使用类级变量?两种实现方案如何选择?
Spring配置类创建Bean时是否可以使用类级状态?
首先给出明确结论:优先选择方案2,绝对不推荐在Spring @Configuration配置类中使用类级成员变量存储Bean初始化的中间状态。
具体原因如下:
- 方案1本身存在大量逻辑、语法问题:
- 试图做链式调用的几个私有方法
settingsService()、fetchConnectionConf()均为void返回值,根本不支持链式调用的写法 createBean()方法中用到的bean变量未定义,getMyBean()方法直接调用myBean()会造成无限递归,触发栈溢出错误- 提前初始化的类成员
myBean无参实例和后续赋值逻辑冲突,逻辑混乱
- 试图做链式调用的几个私有方法
- 配置类使用类级变量存储中间状态有严重风险:
- 被
@Configuration修饰的类会被Spring通过CGLIB动态代理,类成员变量是全局共享的,如果配置类内有多个@Bean方法,或是Bean初始化阶段存在并发场景,极易出现变量被覆盖、状态错乱的问题 - 如果后续调整Bean的作用域为多例
@Scope("prototype"),类级变量会保留上一次Bean初始化的状态,直接导致新创建的Bean属性不符合预期
- 被
- 方案2的优势完全符合Spring配置类的设计原则:
- 所有中间变量都是方法内部的局部变量,线程安全,不存在状态泄露、互相影响的问题
- MyBean的整个初始化逻辑连贯,可读性极强,开发者一眼就能理清属性赋值的全流程,后续调试、修改都非常方便
- 没有多余的方法拆分,代码精简,不会产生额外的维护成本
额外说明:所谓的fluent API应该用于逻辑复用度高、语义明确的场景,方案1的写法属于为了链式调用而强行拆分逻辑,完全是过度设计,没有任何实际价值。
内容的提问来源于stack exchange,提问作者Nilesh S
相关产品推荐
相关产品推荐

