• Spring扩展接口(1):ApplicationContextInitializer


    在此系列文章中,我总结了Spring扩展接口,以及各个扩展点的使用场景。并整理出一个bean在spring中从被加载到初始化到销毁的所有可扩展点的顺序调用图。这样,我们也可以看到bean是如何一步步加载到spring容器中的。


    ApplicationContextInitializer

    org.springframework.context.ApplicationContextInitializer

    ApplicationContextInitializer是Spring框架中的一个扩展接口,用于在应用程序上下文(ApplicationContext)创建之前对其进行自定义初始化。通过实现该接口,您可以在应用程序上下文启动之前执行一些额外的配置或准备工作。

    实现ApplicationContextInitializer接口需要实现其唯一的方法initialize,该方法接受一个泛型参数C extends ConfigurableApplicationContext,表示正在创建的应用程序上下文。在该方法中,您可以对应用程序上下文进行各种自定义操作,例如添加属性源、注册Bean定义、设置环境变量等。

    1、应用场景:

    • 动态加载配置:通过实现ApplicationContextInitializer,您可以在应用程序上下文创建之前加载一些动态的配置,例如从外部配置文件中读取配置信息并注入到Spring的环境中。
    • 执行额外的初始化逻辑:如果您有一些需要在应用程序上下文启动之前执行的初始化逻辑,例如初始化数据库连接池或启动一些后台任务,您可以通过实现ApplicationContextInitializer来实现这些逻辑。

    下面是一个示例,展示了如何实现一个ApplicationContextInitializer来添加一个自定义的属性源:

    import org.springframework.context.ApplicationContextInitializer;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.core.env.MapPropertySource;
    import org.springframework.core.env.MutablePropertySources;
    import java.util.HashMap;
    import java.util.Map;
    
    public class CustomApplicationContextInitializer implements ApplicationContextInitializer {
    
        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            MutablePropertySources propertySources = applicationContext.getEnvironment().getPropertySources();
            
            // 创建自定义的属性源
            Map customProperties = new HashMap<>();
            customProperties.put("custom.property", "custom value");
            MapPropertySource customPropertySource = new MapPropertySource("customPropertySource", customProperties);
            
            // 将自定义属性源添加到应用程序上下文的属性源列表中
            propertySources.addFirst(customPropertySource);
        }
    }
    

    2、生效方式

    由于这时候spring容器还没被初始化,所以想要自己的扩展的生效,有以下三种方式:

    • 在启动类中加入springApplication.addInitializers(new TestApplicationContextInitializer())
    @SpringBootApplication
    public class SandySpringExApplication {
    
        public static void main(String[] args) {
            SpringApplication application = new SpringApplication(SandySpringExApplication.class);
            application.addInitializers(new CustomApplicationContextInitializer()); // 直接在SpringApplication中添加
            application.run(args);
        }
    }
    
    • 配置文件配置context.initializer.classes=com.example.demo.TestApplicationContextInitializer
    # application.properties文件
    context.initializer.classes = com.example.demo.CustomApplicationContextInitializer
    
    • Spring SPI扩展,在spring.factories中加入org.springframework.context.ApplicationContextInitializer=com.example.demo.CustomApplicationContextInitializer

    在resources/META-INF添加spring.factories:

    org.springframework.context.ApplicationContextInitializer = com.sandy.springex.applicationcontextinitializer.CustomApplicationContextInitializer
    
  • 相关阅读:
    steam deck科普、上手教程及模拟器配置指南
    『现学现忘』Git基础 — 36、标签tag(一)
    MongoDB导入导出备份数据
    Mysql Explain
    Python线程(thread)
    移植EasyLogger
    Workfine新手入门:筛选条件—文本判断
    《动手学深度学习 Pytorch版》 5.1 层和块
    1-ubuntu基础——换源第一步
    机器学习(四十二):遗传算法对机器学习多分类器的寻优
  • 原文地址:https://www.cnblogs.com/myshare/p/17727492.html