# SpringBoot 如何让指定的Bean先加载

SpringBoot 如何让指定的Bean先加载

SpringBoot 中如何让自己的某个指定的 Bean 在其他 Bean 前完成被 Spring 加载

ApplicationContextInitializer

  • 用于在spring容器刷新之前初始化Spring ConfigurableApplicationContext的回调接口。(在容器刷新之前调用该类的 initialize 方法。并将 ConfigurableApplicationContext 类的实例传递给该方法)
  • 通常用于需要对应用程序上下文进行编程初始化的web应用程序中。例如,根据上下文环境注册属性源或激活配置文件等。
  • 通过实现ApplicationContextInitializer接口,开发人员可以编程方式对应用程序上下文进行自定义配置。
  • 这在需要动态设置属性、注册Bean定义或执行其他初始化逻辑时非常有用。
public class CustomApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public 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中配置
  • SpringBootSPI扩展---META-INF/spring.factories中配置
org.springframework.context.ApplicationContextInitializer=com.li.springbootproject.spring.other.CustomApplicationContextInitializer 

BeanDefinitionRegistryPostProcessor

  • BeanDefinitionRegistryPostProcessorSpring 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 {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
        // 在这里添加您的自定义逻辑,例如注册新的 bean 或修改现有的 bean 定义

        BeanDefinition beanDefinition = new RootBeanDefinition(MyCustomBean.class);
        registry.registerBeanDefinition("myCustomBean", beanDefinition);
    }

    @Override
    public 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 {
    @Override
    public void afterSingletonsInstantiated() {
        // 在所有单例Bean实例化之后执行初始化逻辑
    }
}

使用@PostConstruct注解

  • @PostConstruct注解用于指定在Bean初始化之后立即执行的方法。您可以在需要先加载的Bean的初始化方法上使用@PostConstruct注解。
@Component
public class MyBean {
    
    @PostConstruct
    public void init() {
        // 在Bean初始化后执行的逻辑
    }
}
Construct`注解。

```java
@Component
public class MyBean {
    
    @PostConstruct
    public void init() {
        // 在Bean初始化后执行的逻辑
    }
}

相关推荐

  1. # SpringBoot 如何指定Bean

    2024-06-05 20:56:05       35 阅读
  2. 手写SpringBoot(四)之bean动态

    2024-06-05 20:56:05       46 阅读
  3. Spring如何控制Bean+执行顺序

    2024-06-05 20:56:05       23 阅读
  4. Spring@Bean通过配置文件实现控制???

    2024-06-05 20:56:05       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 20:56:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 20:56:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 20:56:05       82 阅读
  4. Python语言-面向对象

    2024-06-05 20:56:05       91 阅读

热门阅读

  1. Linux: network: arp 导致问题一例

    2024-06-05 20:56:05       36 阅读
  2. iOS Hittest 机制和实际应用之一 hittest方法

    2024-06-05 20:56:05       29 阅读
  3. iOS object-c 常用API汇总

    2024-06-05 20:56:05       33 阅读
  4. iOS内购欺诈漏洞

    2024-06-05 20:56:05       32 阅读
  5. #媒体#知识分享#职场发展

    2024-06-05 20:56:05       32 阅读
  6. 如何使用 Vue CLI 创建和管理一个 Vue 项目

    2024-06-05 20:56:05       35 阅读
  7. SD-WAN怎样提升企业办公效率

    2024-06-05 20:56:05       29 阅读
  8. 使用Node.js搭建服务器

    2024-06-05 20:56:05       30 阅读
  9. flask的一些简要基础问答

    2024-06-05 20:56:05       32 阅读
  10. React@16.x(16)Render Props

    2024-06-05 20:56:05       32 阅读
  11. React 中图片请求失败使用裂图

    2024-06-05 20:56:05       29 阅读
  12. React@16.x(15)PureComponent 和 memo

    2024-06-05 20:56:05       34 阅读
  13. react的hooks是什么意思

    2024-06-05 20:56:05       18 阅读
  14. 【Python】使用flask作为web服务器

    2024-06-05 20:56:05       29 阅读
  15. Python Flask是什么:深入解析与实用指南

    2024-06-05 20:56:05       33 阅读