You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:42:01