• 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
    
  • 相关阅读:
    [Linux] yum安装软件
    DALL E2【论文阅读】
    基于Python计算PLS中的VIP值(变量投影重要性分析法)
    前端获取资源的方式(ajax、fetch)及其区别
    【算法】二叉树的存储与遍历模板
    Python 教程之控制流(1)python中的循环
    Flutter常见UI组件使用
    WPF图表库LiveCharts的使用
    一个组合多位师傅的渗透测试字典 建议收藏
    关于华为设备vlan接口的总结
  • 原文地址:https://www.cnblogs.com/myshare/p/17727492.html