本文案例以自定义系统初始化器解读loadFactories怎么读取
第一步
新建一个自定义系统初始化器
package com.test.initializer;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import java.util.HashMap;
import java.util.Map;
//自定义初始化器
@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("test", "test");
MapPropertySource propertySource = new MapPropertySource("testInitializer", map);
environment.getPropertySources().addLast(propertySource);
System.out.println("run testInitializer");
}
}
第二步
在spring.factories注入initializer
org.springframework.context.ApplicationContextInitializer=com.test.initializer.FirstInitializer
第三步
断点查看源码怎么实现加载的
外层加载
进入获取Instances方法
loadFactories核心代码在这里
loadFactories源码解读:
- 判断类是否有缓存,有的话直接返回
- 没有缓存的时候读区指定资源文件代码上读区的是 META-INF/spring.factories 文件
- 构造propertirs对象
- 获取指定key对应的value值
- 保存到缓存中并返回结果
- 到createSpringFactoriesInstances方法中依次进行实力化对象