boot启动顺序怎么设置
为什么需要控制Spring Boot中的Bean加载顺序
Spring Boot遵循“约定优于配置”的原则,极大地简化了配置的复杂性。在此基础上,它提供了SPI机制,通过spring.factories文件可以轻松实现小组件的自动装配。
在一般的业务场景中,我们往往不需要关心一个Bean是如何被注册到Spring容器中的。只需将需要注册的Bean标记为@Component,Spring会自动扫描并初始化这个Bean,然后将其加载到Spring上下文中。
当我们在项目启动时需要进行某些业务的初始化工作,或者在开发某个中间件时需要完成自动装配时,事情就变得复杂起来。这时,我们可能会声明自己的Configuration类,但面对多个相互依赖的Bean时,如果不加以控制,就可能会遇到找不到依赖的错误。
尽管我们已将相关的Bean注册到Spring上下文中,但为了更好地管理和避免错误,我们需要控制Spring Boot中Bean的加载顺序。
关于加载顺序的误区
认为@Order注解能控制所有Bean的加载顺序也是一个误区。实际上,@Order注解主要用于指定切面优先级。在4.0版本后,虽然支持集合注入时指定Bean的顺序,但对于实例Bean之间的顺序并无影响。
那么如何控制Bean的加载顺序呢?
使用@DependsOn注解
@DependsOn注解可用于控制Bean的创建顺序。该注解用于声明当前Bean依赖于另一个Bean。所依赖的Bean会在当前Bean实例化之前被容器确保实例化。示例代码如下:
通过参数注入控制加载顺序
在@Bean标注的方法上,如果传入了参数,Spring Boot会自动在Spring上下文中查找该类型的引用,并先初始化该类的实例。利用这一特性,我们也可以控制Bean的加载顺序。示例代码如下:
利用Bean的生命周期中的扩展点
在Spring体系中,从容器到Bean实例化&初始化都有生命周期,并且提供了许多扩展点,允许我们在这些步骤中进行逻辑扩展。这些扩展点的加载顺序由Spring自己控制,大部分情况下我们无法干预。但我们可以利用这些扩展点,在相应的步骤中加入自己的业务初始化代码,从而达到控制加载顺序的目的。
使用@AutoConfigureOrder注解
这个注解用于指定配置文件的加载顺序。在实际测试中,我们发现在某些情况下这个注解并不生效。它主要适用于改变外部依赖的@Configuration的顺序,具体来说,就是通过spring.factories文件引入的外部Configuration。换句话说,@AutoConfigureOrder能改变spring.factories文件中的@Configuration的顺序。具体使用方式如下:
在实际工作中,我们经常会遇到复杂的依赖关系导致的Bean加载问题。将这种不确定给Spring去做不如我们自己控制。通过控制Bean的加载顺序,我们可以更好地管理项目中的依赖关系,提高代码的可读性和可维护性。