欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

详解SpringBoot如何让指定的Bean先加载,

来源: javaer 分享于  点击 36882 次 点评:175

详解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> {
          
              @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

          • 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 {
          
              @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初始化后执行的逻辑
              }
          }
          

          到此这篇关于详解SpringBoot如何让指定的Bean先加载的文章就介绍到这了,更多相关SpringBoot加载指定Bean内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

          您可能感兴趣的文章:
          • SpringBoot优先加载指定Bean的实现
          • SpringBoot bean加载顺序怎样查看(源码解读)
          • springboot中bean的加载顺序问题
          • SpringBoot用配置影响Bean加载@ConditionalOnProperty
          • SpringBoot加载bean的八种方式总结
          相关栏目:

          用户点评