广告
返回顶部
首页 > 资讯 > 精选 >springboot中怎么控制bean的加载顺序
  • 853
分享到

springboot中怎么控制bean的加载顺序

2023-06-16 09:06:06 853人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关SpringBoot中怎么控制bean的加载顺序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 1.为什么需要控制加载顺序springboot遵从约定大于配置的

这期内容当中小编将会给大家带来有关SpringBoot中怎么控制bean的加载顺序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

 1.为什么需要控制加载顺序

springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题。在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功能。

在一般业务场景,可能你不大关心一个bean是如何被注册进spring容器的。只需要把需要注册进容器的bean声明为@Component即可,spring会自动扫描到这个Bean完成初始化并加载到spring上下文容器。

而当你在项目启动时需要提前做一个业务的初始化工作时,或者你正在开发某个中间件需要完成自动装配时。你会声明自己的Configuration类,但是可能你面对的是好几个有互相依赖的Bean。如果不加以控制,这时候可能会报找不到依赖的错误。

但是你明明已经把相关的Bean都注册进spring上下文了呀。这时候你需要通过一些手段来控制springboot中的bean加载顺序。

2.几个误区

在正式说如何控制加载顺序之前,先说2个误区。

在标注了@Configuration的类中,写在前面的@Bean一定会被先注册

这个不存在的,spring在以前xml的时代,也不存在写在前面一定会被先加载的逻辑。因为xml不是渐进的加载,而是全部parse好,再进行依赖分析和注册。到了springboot中,只是省去了xml被parse成spring内部对象的这一过程,但是加载方式并没有大的改变。

利用@Order这个标注能进行加载顺序的控制

严格的说,不是所有的Bean都可以通过@Order这个标注进行顺序的控制。你把@Order这个标注加在普通的方法上或者类上一点鸟用都没有。

那@Order能控制哪些bean的加载顺序呢,我们先看看官方的解释:

{@code @Order} defines the sort order for an annotated component. Since Spring 4.0, annotation-based ordering is supported for many kinds of components in Spring, even for collection injection where the order values of the target components are taken into account (either from their target class or from their {@code @Bean} method). While such order values may influence priorities at injection points, please be aware that they do not influence singleton startup order which is an orthoGonal concern determined by dependency relationships and {@code @DependsOn} declarations (influencing a runtime-determined dependency graph).

最开始@Order注解用于切面的优先级指定;在 4.0 之后对它的功能进行了增强,支持集合的注入时,指定集合中 bean 的顺序,并且特别指出了,它对于但实例的 bean 之间的顺序,没有任何影响。

目前用的比较多的有以下3点:

  • 控制aop的类的加载顺序,也就是被@Aspect标注的类

  • 控制ApplicationListener实现类的加载顺序

  • 控制CommandLineRunner实现类的加载顺序

3.如何控制

3.1@DependsOn

@DependsOn注解可以用来控制bean的创建顺序,该注解用于声明当前bean依赖于另外一个bean。所依赖的bean会被容器确保在当前bean实例化之前被实例化。

示例:

@Configuration  public class BeanOrderConfiguration {      @Bean      @DependsOn("beanB")      public BeanA beanA(){          System.out.println("bean A init");          return new BeanA();      }      @Bean      public BeanB beanB(){          System.out.println("bean B init");          return new BeanB();      }      @Bean      @DependsOn({"beanD","beanE"})      public BeanC beanC(){          System.out.println("bean C init");          return new BeanC();      }      @Bean      @DependsOn("beanE")      public BeanD beanD(){          System.out.println("bean D init");          return new BeanD();      }      @Bean      public BeanE beanE(){          System.out.println("bean E init");          return new BeanE();      }  }

以上代码bean的加载顺序为:

bean B init  bean A init  bean E init  bean D init  bean C init

@DependsOn的使用:

  • 直接或者间接标注在带有@Component注解的类上面;

  • 直接或者间接标注在带有@Bean注解的方法上面;

  • 使用@DependsOn注解到类层面仅仅在使用 component-scanning 方式时才有效,如果带有@DependsOn注解的类通过XML方式使用,该注解会被忽略,<bean depends-on="..."/>这种方式会生效。

3.2 参数注入

在@Bean标注的方法上,如果你传入了参数,springboot会自动会为这个参数在spring上下文里寻找这个类型的引用。并先初始化这个类的实例。

利用此特性,我们也可以控制bean的加载顺序。

示例:

@Bean  public BeanA beanA(BeanB demoB){    System.out.println("bean A init");    return new BeanA();  }  @Bean  public BeanB beanB(){    System.out.println("bean B init");    return new BeanB();  }

以上结果,beanB先于beanA被初始化加载。

需要注意的是,springboot会按类型去寻找。如果这个类型有多个实例被注册到spring上下文,那你就需要加上@Qualifier("Bean的名称")来指定

3.3 利用bean的生命周期中的扩展点

在spring体系中,从容器到Bean实例化&初始化都是有生命周期的,并且提供了很多的扩展点,允许你在这些步骤时进行逻辑的扩展。

这些可扩展点的加载顺序由spring自己控制,大多数是无法进行干预的。我们可以利用这一点,扩展spring的扩展点。在相应的扩展点加入自己的业务初始化代码。从来达到顺序的控制。

具体关于spring容器中大部分的可扩展点的分析,之前已经写了一篇文章详细介绍了:《Springboot启动扩展点超详细总结,再也不怕面试官问了》。

3.4 @AutoConfigureOrder

这个注解用来指定配置文件的加载顺序。但是在实际测试中发现,以下这样使用是不生效的:

@Configuration  @AutoConfigureOrder(2)  public class BeanOrderConfiguration1 {      @Bean      public BeanA beanA(){          System.out.println("bean A init");          return new BeanA();      }  } @Configuration  @AutoConfigureOrder(1)  public class BeanOrderConfiguration2 {      @Bean      public BeanB beanB(){          System.out.println("bean B init");          return new BeanB();      }  }

无论你2个数字填多少,都不会改变其加载顺序结果。

那这个@AutoConfigureOrder到底是如何使用的呢。

经过测试发现,@AutoConfigureOrder只能改变外部依赖的@Configuration的顺序。如何理解是外部依赖呢。

能被你工程内部scan到的包,都是内部的Configuration,而spring引入外部的Configuration,都是通过spring特有的spi文件:spring.factories

换句话说,@AutoConfigureOrder能改变spring.factories中的@Configuration的顺序。

具体使用方式:

@Configuration  @AutoConfigureOrder(10)  public class BeanOrderConfiguration1 {      @Bean      public BeanA beanA(){          System.out.println("bean A init");          return new BeanA();      }  }  @Configuration  @AutoConfigureOrder(1)  public class BeanOrderConfiguration2 {      @Bean      public BeanB beanB(){          System.out.println("bean B init");          return new BeanB();      }  }

spring.factories:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\    com.example.demo.BeanOrderConfiguration1,\    com.example.demo.BeanOrderConfiguration2

上述就是小编为大家分享的springboot中怎么控制bean的加载顺序了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: springboot中怎么控制bean的加载顺序

本文链接: https://www.lsjlt.com/news/283032.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot中怎么控制bean的加载顺序
    这期内容当中小编将会给大家带来有关springboot中怎么控制bean的加载顺序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 1.为什么需要控制加载顺序springboot遵从约定大于配置的...
    99+
    2023-06-16
  • 使用Spring @DependsOn控制bean加载顺序的实例
    spring容器载入bean顺序是不确定的,spring框架没有约定特定顺序逻辑规范。但spring保证如果A依赖B(如beanA中有@Autowired B的变量),那么B将先于A...
    99+
    2022-11-12
  • 【微服务】spring 控制bean加载顺序使用详解
    目录 一、前言 二、使用@order注解控制顺序 2.1 @order 注解使用示例 2.2 order注解顺序失效问题 2.2.1 @order失效问题解决办法 2.3 实现Ordered接口 三、使用@dependon注解控制顺序 四、...
    99+
    2023-09-30
    spring bean加载顺序 控制bean的加载顺序 如何控制bean的顺序
  • Spring怎么控制Bean注入的顺序
    今天小编给大家分享一下Spring怎么控制Bean注入的顺序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。简介说明首先需要说...
    99+
    2023-07-02
  • spring或者springboot调整bean加载顺序的方式
    目录spring 或者spring boot 调整bean 的加载顺序1、使用@Order调整配置类加载顺序2、使用@Order调整配置类加载顺序3、实现ordered 接口:spr...
    99+
    2023-03-01
    spring boot bean加载顺序 spring bean加载顺序
  • spring或spring boot怎么调整bean加载顺序
    今天小编给大家分享一下spring或spring boot怎么调整bean加载顺序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2023-07-05
  • springboot中的静态资源加载顺序优先级
    目录springboot静态资源加载顺序优先级看springboot源码里面springboot静态资源加载规则一、静态资源映射规则1.webjars2.springboot内置默认...
    99+
    2022-11-12
  • 详解Spring 中如何控制2个bean中的初始化顺序
    开发过程中有这样一个场景,2个 bean 初始化逻辑中有依赖关系,需要控制二者的初始化顺序。实现方式可以有多种,本文结合目前对 Spring 的理解,尝试列出几种思路。场景假设A,B两个 bean 都需要在初始化的时候从本地磁盘读取文件,其...
    99+
    2023-05-31
    spring bean bea
  • Springboot中注解及配置文件加载顺序是怎样的
    这篇文章将为大家详细讲解有关Springboot中注解及配置文件加载顺序是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Springboot常用注解及底层实现@SpringBootAp...
    99+
    2023-06-25
  • 怎么理解SpringBoot Bean加载优先级的问题
    本篇内容介绍了“怎么理解SpringBoot Bean加载优先级的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Bean加载优先级的问题...
    99+
    2023-06-25
  • Java中类的加载顺序是什么
    本篇文章为大家展示了Java中类的加载顺序是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体如下:public class Parent { public static int a = pa...
    99+
    2023-05-31
    java 中类 ava
  • springboot中一个service内组件加载顺序的示例分析
    小编给大家分享一下springboot中一个service内组件加载顺序的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!springboot servic...
    99+
    2023-06-20
  • 使用@Order控制配置类/AOP/方法/字段的加载顺序详解
    目录@Order控制配置类/AOP/方法/字段的加载顺序1.AOP加载顺序2.配置类加载顺序@Order使用与Aop多切面执行顺序@Order控制配置类/AOP/方法/字段的加载顺序...
    99+
    2022-11-13
  • 遇到php中extension加载顺序问题怎么办
    这篇文章将为大家详细讲解有关遇到php中extension加载顺序问题怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php extension 加载顺序问题有的php扩展,加载是有先后顺序的,如果搞...
    99+
    2023-06-09
  • Java中父子类的加载顺序是什么
    今天就跟大家聊聊有关Java中父子类的加载顺序是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 静态 > 非静态当且仅当该类在程序中第一次被 new(是第一次被类加载器...
    99+
    2023-06-20
  • 怎么用CSS3中的属性box-direction控制布局顺序
    这篇文章主要为大家展示了“怎么用CSS3中的属性box-direction控制布局顺序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用CSS3中的属性box...
    99+
    2022-10-19
  • vue-router中怎么实现路由懒加载和权限控制
    今天就跟大家聊聊有关vue-router中怎么实现路由懒加载和权限控制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、为什么要使用路由懒加载呢用v...
    99+
    2022-10-19
  • 怎么在Java中控制程序的逻辑
    怎么在Java中控制程序的逻辑?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对...
    99+
    2023-06-14
  • Windows控制面板中添加删除程序无法打开怎么办
    这篇文章主要介绍Windows控制面板中添加删除程序无法打开怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用组合快捷键win键+r键打开运行窗口,在打开的运行窗口中输入“gpedit.msc”点击确定打开本地...
    99+
    2023-06-28
  • Python中的程序流程控制语句怎么用
    这篇文章主要介绍了Python中的程序流程控制语句怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中的程序流程控制语句怎么用文章都会有所收获,下面我们一起来看看吧。一、分支语句在Python中分...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作