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

Spring是否会保证无依赖的独立Bean的创建顺序始终一致?

Spring无依赖同类型Bean实例化顺序说明

你给出的四个无任何依赖关系的@Component注解Bean,实例化顺序没有被Spring官方承诺为永久固定,绝对不可以在业务代码中依赖该默认顺序实现逻辑。

具体细节如下:

  • 低版本Spring(5.2.x之前)中,组件扫描获取Bean定义的顺序取决于操作系统文件目录遍历顺序、JDK类加载返回顺序,同环境下可能看起来顺序固定,但换操作系统、换JDK版本顺序就会发生变化,本质是不可控的。
  • Spring 5.2.x及之后版本,框架内部对无依赖的候选Bean定义增加了默认按类全限定名字典序排序的逻辑,相同代码、相同环境、相同Spring版本下你大概率会得到固定的执行顺序,但这个排序逻辑不属于官方公开的稳定承诺,后续版本迭代、项目新增其他Bean、调整组件扫描范围都可能打乱现有顺序。
  • 如果需要强制固定初始化顺序,请使用Spring官方提供的可控方案:
    • 在Bean类上加@Order注解,值越小优先级越高,越先被实例化
    • 使用@DependsOn注解显式声明Bean的前置依赖,比如给Bean2加@DependsOn("bean11")就会强制Bean11先初始化完成再初始化Bean2
    • 让Bean类实现org.springframework.core.Ordered接口,自定义优先级

你给出的测试代码如下:

@Component
public class Bean11 {

  @PostConstruct
  public void post(){
   System.out.println("I am bean # 1");
  }
}

@Component
public class Bean2 {

  @PostConstruct
  public void post(){
   System.out.println("I am bean # 2");
  }
}

@Component
public class Bean3 {

  @PostConstruct
  public void post(){
   System.out.println("I am bean # 3");
  }
}

@Component
public class Bean4 {

  @PostConstruct
  public void post(){
   System.out.println("I am bean # 4");
  }
}

如果你直接运行上面的代码,同环境下看到的输出顺序大概率是固定的,但这只是特定版本下的偶然表现,不能当做通用规律使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:45:04