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

Spring纯Java配置中@Bean方法不同可见性修饰符的差异

Spring纯Java配置中@Bean方法可见性修饰符的区别

假设我们有一个仅使用Java配置的Spring 5项目,配置类结构如下:

@Configuration
class AppConfig{

  @Bean
  <可见性修饰符> MyComponent first(){
    return new MyComponent();
  }

  // 其他@Bean注解方法
}

// 其他遵循类似结构的配置类

在纯Java配置(无XML混合)的场景下,@Bean方法使用public与其他可见性修饰符的区别如下:

  • public修饰符(官方推荐)
    这是Spring官方文档中最常用的修饰符,符合Java方法可见性的常规规范。它允许其他配置类通过@Import引入当前配置类后,直接调用该@Bean方法来复用Bean实例(Spring会自动将这类方法调用处理为Bean引用,而非重复创建对象)。同时,Spring的CGLIB代理逻辑能完整作用于public方法,保证配置类在full模式(默认开启)下的Bean单例性和依赖注入正确性。

  • private修饰符
    标记为private的@Bean方法只能在当前配置类内部调用,外部配置类无法直接访问。Spring仍能正常创建对应的Bean实例,但由于private方法无法被CGLIB代理,若在当前配置类的其他@Bean方法中调用这个private方法,Spring不会将其视为Bean引用,而是会直接执行方法创建新的实例,破坏Bean的单例特性。这种修饰符适合那些仅在当前配置类内部使用、不需要外部复用的Bean定义。

  • protected修饰符
    允许当前配置类的子类继承并覆盖该@Bean方法,适合需要通过子类定制Bean逻辑的场景。同时Spring的代理逻辑能正常生效,子类中的方法被代理后,依然能保证Bean的单例性。不过包内非子类的其他类无法直接访问该方法。

  • 包私有(默认无修饰符)
    仅允许同包下的其他配置类访问该@Bean方法。代理逻辑正常生效,同包内的配置类调用该方法时,Spring会自动处理为Bean引用而非新实例。但这种可见性限制了跨包的Bean复用需求,除非通过@Autowired注入Bean实例,而非直接调用@Bean方法。

总的来说,在纯Java配置场景下,除了private修饰符会带来内部调用的单例性问题外,其他修饰符都能让Spring核心功能正常运行,但public是最通用、最符合官方规范的选择,能避免潜在的复用和代理问题。

内容的提问来源于stack exchange,提问作者diziaq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:55:25