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<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        MutablePropertySources propertySources = applicationContext.getEnvironment().getPropertySources();
        
        // 創建自定義的屬性源
        Map<String, Object> 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章