SpringBoot基础-初始化器自定义实现

本文介绍了如何自定义SpringBoot初始化器,包括实现ApplicationContextInitializer接口,通过META-INF/spring.factories配置,以及在application.yml中配置。同时讨论了初始化顺序:application.properties > META-INF/spring.factories > SpringApplication类初始化,并解释了Order值对执行顺序的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义初始化器实现

实现 ApplicationContextInitializer接口

@Order(1)
public class FirstInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        Map<String, Object> map = new HashMap<>();
        map.put("key1", "first");
        MapPropertySource mapPropertySource = new MapPropertySource("firstInitializer", map);
        environment.getPropertySources().addLast(mapPropertySource);
        System.out.println("run FirstInitializer");
    }
}

加载到springboot中

META-INF文件夹下spring.factories内填写接口实现(FirstInitializer)

  • 在resources下新建META-INF文件夹,新建spring.factories中定义,key为:org.springframework.context.ApplicationContextInitializer
org.springframework.context.ApplicationContextInitializer=com.demo.silly.spring.boot.initializer.FirstInitializer

在这里插入图片描述

通过SpringApplication类初始化后设置进去(SecondInitializer)

@SpringBootApplication
public class SpringBootDemoApplication {
    public static void main(String[] args) {
//		SpringApplication.run(SpringBootDemoApplication.class, args);

        SpringApplication springApplication = new SpringApplication((SpringBootDemoApplication.class));
        springApplication.addInitializers(new SecondInitializer());
        springApplication.run(args);
    }
}

在application.yml种配置(ThreeInitializer)

  • application.properties 内填写接口实现,key为:context.initializer.classes
context:
  initializer:
    classes: com.demo.silly.spring.boot.initializer.ThreeInitializer

获取参数方式

  • 代码获取

    @Component
    public class SpringUtils implements ApplicationContextAware {
    
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        /**
         * 获取属性
         *
         * @param key
         * @return
         */
        public String get(String key) {
            return applicationContext.getEnvironment().getProperty(key);
        }
    }
    
  • 属性值获取

    @Value("${key1}")
    private String key1;
    

顺序结果

run ThreeInitializer
run FirstInitializer
run SecondInitializer

由执行打印的顺序可以得出:

  • application.properties > META-INF下spring.factories > SpringApplication类初始化后设置
  • Order值越小越先执行

系统初始化器的实现原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值