SpringBoot 如何让指定的Bean先加载
文章目录
- SpringBoot 如何让指定的Bean先加载
- `ApplicationContextInitializer`
- 使用
- 启动入口出注册
- 配置文件中配置
- spring.factories中配置
 
 
- `BeanDefinitionRegistryPostProcessor`
- 使用
 
- 使用@DependsOn注解
- 实现SmartInitializingSingleton接口
- 使用@PostConstruct注解
 
在
SpringBoot中如何让自己的某个指定的Bean在其他Bean前完成被Spring加载
ApplicationContextInitializer
 
- 用于在spring容器刷新之前初始化Spring ConfigurableApplicationContext的回调接口。(在容器刷新之前调用该类的initialize方法。并将ConfigurableApplicationContext类的实例传递给该方法)
- 通常用于需要对应用程序上下文进行编程初始化的web应用程序中。例如,根据上下文环境注册属性源或激活配置文件等。
- 通过实现ApplicationContextInitializer接口,开发人员可以编程方式对应用程序上下文进行自定义配置。
- 这在需要动态设置属性、注册Bean定义或执行其他初始化逻辑时非常有用。
public class CustomApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {ConfigurableEnvironment environment = applicationContext.getEnvironment();// 注册自定义Bean定义// applicationContext.registerBean("customBean", CustomBean.class);System.out.println("Custom initialization logic executed");}
}
- CustomApplicationContextInitializer实现了- ApplicationContextInitializer接口,并覆盖了- initialize方法。
- 在initialize方法中,我们可以获取应用程序上下文的环境对象,并进行自定义配置,如设置属性或注册Bean定义。
使用
启动入口出注册
- 要在Spring Boot应用程序中使用ApplicationContextInitializer,可以将其注册为Spring Boot应用程序的一部分。例如,在Spring Boot应用程序的main方法中,可以使用SpringApplication类的addInitializers方法将自定义的ApplicationContextInitializer添加到应用程序中:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(MySpringBootApplication.class);application.addInitializers(new CustomApplicationContextInitializer());application.run(args);}
}
配置文件中配置
context.initializer.classes=com.li.springbootproject.spring.other.CustomApplicationContextInitializer 
spring.factories中配置
- SpringBoot的- SPI扩展- ---META-INF/spring.factories中配置
org.springframework.context.ApplicationContextInitializer=com.li.springbootproject.spring.other.CustomApplicationContextInitializer 
BeanDefinitionRegistryPostProcessor
 
- BeanDefinitionRegistryPostProcessor是- Spring Boot中的一个接口,它允许您在应用程序上下文刷新之前修改- bean定义。这对于注册额外的- bean、修改现有- bean定义或执行其他自定义操作很有用。
使用
- 创建一个实现 BeanDefinitionRegistryPostProcessor接口的类。
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {// 在这里添加您的自定义逻辑,例如注册新的 bean 或修改现有的 bean 定义BeanDefinition beanDefinition = new RootBeanDefinition(MyCustomBean.class);registry.registerBeanDefinition("myCustomBean", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 通常不需要在此方法中执行任何操作}
}-  创建了一个名为 MyBeanDefinitionRegistryPostProcessor的类,它实现了BeanDefinitionRegistryPostProcessor接口。在postProcessBeanDefinitionRegistry方法中,我们注册了一个名为myCustomBean的新 bean,它是MyCustomBean类的实例。
-  将 @Configuration注解添加到您的BeanDefinitionRegistryPostProcessor实现类上。这将告诉Spring Boot在应用程序上下文初始化期间自动检测和应用该类。
-  运行 Spring Boot应用程序。一旦应用程序上下文初始化,就会自动调用postProcessBeanDefinitionRegistry方法,从而允许修改bean定义。
请注意,在使用
BeanDefinitionRegistryPostProcessor时要小心,因为它可能会影响应用程序的其他部分。在修改bean定义时,请确保您了解自己在做什么,并且知道潜在的副作用。
使用@DependsOn注解
- @DependsOn注解可以用在一个- Bean上,指定它依赖于另一个- Bean。这样一来,- Spring Boot在初始化该- Bean时,会先初始化它所依赖的- Bean。
@Component
public class MyBean1 {// ...
}@Component
@DependsOn("myBean1")
public class MyBean2 {// ...
}
实现SmartInitializingSingleton接口
- SmartInitializingSingleton接口在所有单例- Bean都实例化之后调用,可以在该接口的- afterSingletonsInstantiated方法中执行一些特定的操作。可以实现该接口并在方法中指定需要先加载的- Bean的初始化逻辑。
@Component
public class MyBean implements SmartInitializingSingleton {@Overridepublic void afterSingletonsInstantiated() {// 在所有单例Bean实例化之后执行初始化逻辑}
}
使用@PostConstruct注解
- @PostConstruct注解用于指定在- Bean初始化之后立即执行的方法。您可以在需要先加载的- Bean的初始化方法上使用- @PostConstruct注解。
@Component
public class MyBean {@PostConstructpublic void init() {// 在Bean初始化后执行的逻辑}
}
Construct`注解。```java
@Component
public class MyBean {@PostConstructpublic void init() {// 在Bean初始化后执行的逻辑}
}