Spring 启动顺序
Spring 容器中的 bean 创建和初始化可能涉及到复杂的依赖关系,因此 Spring 提供了多种方式来控制 bean 的加载顺序。
@Order
注解或者实现Ordered
接口:可以在配置类或者组件上使用
@Order
注解或者实现Ordered
接口来指定加载顺序。数值越小,优先级越高。
@Configuration
@Order(1)
public class ConfigA {
// ...
}
@Configuration
@Order(2)
public class ConfigB {
// ...
}
实现
PriorityOrdered
接口:继承
PriorityOrdered
接口的 bean 会优先于实现Ordered
接口的 bean 被加载。实现
ApplicationRunner
或CommandLineRunner
接口:这两个接口会在 Spring 容器加载完所有 bean 后执行,可以用来执行一些依赖于所有 bean 初始化完毕的操作。
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
// 在这里执行逻辑
}
}
@DependsOn
注解:使用
@DependsOn
可以指定 bean 的依赖关系,被依赖的 bean 会先于当前 bean 被加载。
@Component
@DependsOn("beanA")
public class BeanB {
// ...
}
使用
BeanFactoryPostProcessor
:通过实现
BeanFactoryPostProcessor
接口,可以自定义 bean 的定义,并可以修改 bean 的加载顺序。
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 修改 bean 的定义或者顺序
}
}
使用
@Profile
注解:根据当前激活的 profile 来加载不同的 bean,这些 bean 的加载顺序和
@Profile
指定的顺序一致。使用
ApplicationContextInitializer
:通过实现
ApplicationContextInitializer
接口,可以在 Spring 容器启动的早期阶段进行自定义初始化。
public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
// 自定义初始化逻辑
}
}
以上方法可以控制 Spring 容器中 bean 的加载顺序,具体使用哪种方法取决于具体的需求。
评论已关闭