import java.io.File;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {
private static final String mainYml = "application.yml";
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
String parent = System.getProperty("application.path");
File parentFile = new File(parent);
if(!parentFile.exists()){
throw new NullPointerException("外部配置文件为空");
}else {
log.info("开始加载外部配置文件");
File main = loadYml(parent);
File active = loadMainYml(parent);
YamlPropertiesFactoryBean mainYml = new YamlPropertiesFactoryBean();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
mainYml.setResources(new FileSystemResource(main));
yaml.setResources(new FileSystemResource(active));
MutablePropertySources propertySources = environment.getPropertySources();
propertySources.addFirst(new PropertiesPropertySource(main.getName(), mainYml.getObject()));
propertySources.addFirst(new PropertiesPropertySource(active.getName(), yaml.getObject()));
}
}
public File loadYml(String parent){
String main = parent + File.separator + mainYml;
return new File(main);
}
public File loadMainYml(String parent){
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
String main = parent + File.separator + mainYml;
File mainFile = new File(main);
if(mainFile.exists()){
yaml.setResources(new FileSystemResource(mainFile));
String active = yaml.getObject().getProperty("spring.profiles.active");
String envFile = parent + File.separator + "application-" + active + ".yml";
return new File(envFile);
}
return null;
}
}