千家信息网

怎么理解SpringBoot Bean加载优先级的问题

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"怎么理解SpringBoot Bean加载优先级的问题"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读
千家信息网最后更新 2026年11月02日怎么理解SpringBoot Bean加载优先级的问题

本篇内容介绍了"怎么理解SpringBoot Bean加载优先级的问题"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Bean加载优先级的问题

spring容器载入bean顺序是不确定的,spring框架没有约定特定顺序逻辑规范。但spring保证如果A依赖B(如beanA中有@Autowired B的变量),那么B将先于A被加载。

同一个类中加载顺序

Constructor >> @Autowired >>@ PostConstruct>>@Bean

@DependsOn控制顺序

如果A不依赖B,但是A需要在B后面初始化,可以使用@DependsOn(value="Bbeanname")。B的@Bean上面需要手动指定Name,否则找不到。

@Order不能控制顺序

@Order注解并不能改变Bean加载优先级,@Order注解用于设置装载到list中Bean的顺序

@Order(2)@Componentpublic class AnoBean1 implements IBean {    private String name = "ano order bean 1";    public AnoBean1() {        System.out.println(name);    }}@Order(1)@Componentpublic class AnoBean2 implements IBean {    private String name = "ano order bean 2";    public AnoBean2() {        System.out.println(name);    }}@Componentpublic class AnoTestBean {    public AnoTestBean(List anoBeanList) {        for (IBean bean : anoBeanList) {            System.out.println("in ano testBean: " + bean.getClass().getName());        }    }}

上面代码输出结果

ano order bean 1
ano order bean 2
in ano testBean: AnoBean2
in ano testBean: AnoBean1

Spring控制Bean加载顺序

使用Spring @Order控制bean加载顺序

两个演示bean

package com.ziyear.spring4_2.order;public class Demo1Service {}
package com.ziyear.spring4_2.order;public class Demo2Service {}

两个配置类,注意@Order配置加载的顺序

package com.ziyear.spring4_2.order;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.annotation.Order;@Configuration@Order(2)public class Demo1Config {    @Bean    public Demo1Service demo1Service(){        System.out.println("demo1config 加载了");        return new Demo1Service();    }}
package com.ziyear.spring4_2.order;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.annotation.Order;@Configuration@Order(1)public class Demo2Config {    @Bean    public Demo2Service demo2Service(){        System.out.println("demo2config 加载了");        return new Demo2Service();    }}

运行

package com.ziyear.spring4_2.order;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {    public static void main(String[] args) {        AnnotationConfigApplicationContext context =                new AnnotationConfigApplicationContext("com.ziyear.spring4_2.order");    }}

输出结果

demo2config 加载了
demo1config 加载了

使用Spring @DependsOn控制bean加载顺序

spring容器载入bean顺序是不确定的,spring框架没有约定特定顺序逻辑规范。但spring保证如果A依赖B(如beanA中有@Autowired B的变量),那么B将先于A被加载。但如果beanA不直接依赖B,我们如何让B仍先加载呢?

控制bean初始化顺序

可能有些场景中,bean A 间接依赖 bean B。如Bean B应该需要更新一些全局缓存,可能通过单例模式实现且没有在spring容器注册,bean A需要使用该缓存;因此,如果bean B没有准备好,bean A无法访问。

另一个场景中,bean A是事件发布者(或JMS发布者),bean B (或一些) 负责监听这些事件,典型的如观察者模式。我们不想B 错过任何事件,那么B需要首先被初始化。

简言之,有很多场景需要bean B应该被先于bean A被初始化,从而避免各种负面影响。我们可以在bean A上使用@DependsOn注解,告诉容器bean B应该先被初始化。下面通过示例来说明。

示例说明

示例通过事件机制说明,Person和Man,然后通过spring配置运行。为了方便说明,示例进行了简化。

Person类

public class Person {    public static void say(){        System.out.println("person.say():Im a person");    }}

Man类

public class Man {    public void say(){        System.out.println("man.say():Im a man:");    }}

AppConfig.java

配置运行类。

@Configuration@ComponentScan("com.ziyear.demo")public class Appconfig {    @Bean(initMethod = "say")    @DependsOn("man")    public Person personBean () {        return new Person();    }    @Bean(name = "man", initMethod = "say")    //@Lazy    public Man manBean () {        return new Man();    }    public static void main (String[] strings) {        new AnnotationConfigApplicationContext(Appconfig.class);    }}

运行AppConfig的main方法,输出结果为:

man.say():Im a man:
person.say():Im a person

"怎么理解SpringBoot Bean加载优先级的问题"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

顺序 控制 优先级 事件 容器 示例 输出 运行 配置 问题 场景 注解 结果 两个 内容 发布者 变量 更多 框架 模式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 互联网科技会 科技互联网公司装修 美国互联网科技巨头监管 深圳齐家互联网科技 互联网科技公司介绍 镁科技互联网资讯平台 中国最先进互联网科技公司 互联网金融中的现代科技 亳州好赞互联网科技有限公司 内蒙古九一互联网科技 翼展科技 首家互联网医院 中国互联网有什么科技 有人说阿里系是互联网科技企业 陕西云淼互联网科技公司 广州梦谷互联网科技有限公司领导 全球科技与互联网公司市值变化 北京品多多互联网科技有限公司 上海旺乐尼互联网科技有限公司 科技互联网企业在行动 互联网科技网 科技互联网技术 美国互联网黑科技 互联网科技公司的市场部门 成都玖崟互联网科技有限公司乐商圈怎么样 港股科技和互联网 呼和浩特新华互联网科技学院 互联网营销推广黑科技 上海创道互联网络科技有限公司 科技互联网专业工作会议发言稿
0