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接口,自定义优先级
- 在Bean类上加
你给出的测试代码如下:
@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
相关产品推荐
相关产品推荐

