Spring 启动顺序
warning:
这篇文章距离上次修改已过416天,其中的内容可能已经有所变动。
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 的加载顺序,具体使用哪种方法取决于具体的需求。
评论已关闭