Spring中使用static静态方法定义@Bean是否属于良好开发实践?
Spring @Bean注解搭配静态方法的实践说明
核心结论
将@Bean标注在静态方法上不属于通用的最佳实践,仅在少数特定场景下是官方推荐的合理用法,普通业务场景不建议使用。
静态@Bean的运行逻辑
当@Bean标注在静态方法上时,Spring会直接调用该静态方法生成Bean实例,不需要等待所属@Configuration配置类完成实例化、CGLIB增强的流程。
适用场景(推荐使用的情况)
仅当你要注册的Bean属于容器生命周期早期执行的后置处理器时,才建议使用静态@Bean:
- 这类Bean包括
BeanFactoryPostProcessor、BeanPostProcessor、ApplicationContextInitializer等,它们的初始化时机远早于普通配置类的处理流程 - 如果用普通实例方法定义这类Bean的
@Bean,会触发配置类提前实例化,跳过CGLIB增强逻辑,后续配置类中调用其他@Bean方法时会无法走代理逻辑,导致同一个Bean被多次实例化的问题 - 静态
@Bean可以避免配置类的提前实例化,是Spring官方针对该场景的推荐写法
不推荐使用的场景
普通业务Bean的注册完全没必要使用静态@Bean,弊端非常明显:
- 静态方法无法访问配置类的实例成员属性、其他注入的依赖,后续调整Bean创建逻辑需要依赖配置类其他资源时,改造成本很高
- 静态
@Bean无法享受配置类CGLIB代理的能力:同一个配置类的其他@Bean方法调用该静态方法时,每次都会新生成一个对象,不符合单例Bean的预期,极易引发隐藏bug
针对给出的代码示例的说明
示例代码如下:
public class Foo { }
@Configuration public class FooFactory { @Bean public static Foo getFoo() { return new Foo(); } }
如果你的Foo是普通业务类,上述写法完全没有必要,去掉方法上的static修饰符即可;如果Foo是后置处理器类,那么这个写法是符合规范的。
内容的提问来源于stack exchange,提问作者devxgb
相关产品推荐
相关产品推荐

