我们有时会因为业务要求,spring除了加载classpath下的资源文件,还要求加载外部的资源文件(自定义目录),所以要做一些处理,在处理时遵循spring的加载顺序,properties > yaml > yml。
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.util.CollectionUtils;
import java.io.File;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 简述: 属性文件配置
*
* @author wenlong
*/
@Slf4j
@Configuration
public class GridntPropertiesConfig {
@Bean
public PropertyPlaceholderConfigurer properties(){
PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
configurer.setIgnoreUnresolvablePlaceholders(true);
//处理classPath中的属性文件
dealClassPathProperties(configurer);
//处理自定义属性文件
dealCustomProperties(configurer);
return configurer;
}
/**
* 处理自定义属性文件
* @param configurer
*/
private void dealCustomProperties(PropertyPlaceholderConfigurer configurer) {
String path = getPath();
if(StringUtils.isBlank(path)){
return;
}
File file = new File(path);
if(file.exists() && file.isDirectory()){
List<String> files = Arrays.asList(file.list());
Set<String> ymlSet = new HashSet<>();
Set<String> yamlSet = new HashSet<>();
Set<String> propertiesSet = new HashSet<>();
if(!CollectionUtils.isEmpty(files)){
for(String s : files) {
if(s.endsWith(".yml")){
ymlSet.add(s);
}else if(s.endsWith(".yaml")){
yamlSet.add(s);
}else if(s.endsWith(".properties")){
propertiesSet.add(s);
}
}
//处理yml及yaml类型的属性文件
dealYamlProperties(configurer, path, ymlSet);
dealYamlProperties(configurer, path, yamlSet);
if(!CollectionUtils.isEmpty(propertiesSet)){
propertiesSet.forEach(s -> {
FileSystemResource propertiesResource = new FileSystemResource(path.concat(File.separator).concat(s));
configurer.setLocations(propertiesResource);
});
}
}
}else{
log.warn("自定义属性配置文件目录{}不存在!", path);
}
}
/**
* 处理classPath中的属性文件
* @param configurer
*/
private void dealClassPathProperties(PropertyPlaceholderConfigurer configurer) {
ClassPathResource yml = new ClassPathResource("application.yml");
ClassPathResource yaml = new ClassPathResource("application.yaml");
if(yml.exists()){
YamlPropertiesFactoryBean ymlProperties = new YamlPropertiesFactoryBean();
ymlProperties.setResources(yml);
configurer.setProperties(ymlProperties.getObject());
}
if(yaml.exists()){
YamlPropertiesFactoryBean yamlProperties = new YamlPropertiesFactoryBean();
yamlProperties.setResources(yaml);
configurer.setProperties(yamlProperties.getObject());
}
configurer.setLocations(new ClassPathResource("application.properties"));
}
/**
* 处理yml及yaml类型的属性文件
* @param configurer
* @param path
* @param ymlSet
*/
private void dealYamlProperties(PropertyPlaceholderConfigurer configurer, String path, Set<String> ymlSet) {
if (!CollectionUtils.isEmpty(ymlSet)) {
ymlSet.forEach(s -> {
FileSystemResource ymlResource = new FileSystemResource(path.concat(File.separator).concat(s));
YamlPropertiesFactoryBean yamlProperties = new YamlPropertiesFactoryBean();
yamlProperties.setResources(ymlResource);
configurer.setProperties(yamlProperties.getObject());
});
}
}
/**
* 获取自定义属性配置目录
* @return
*/
private String getPath() {
String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
if (System.getProperty("os.name").contains("dows")) {
path = path.substring(1);
}
if (path.contains("jar")) {
path = path.substring(0, path.lastIndexOf("/"));
path = path.substring(0, path.lastIndexOf("/"));
path = path.substring(0, path.lastIndexOf("/"));
}else{
return "";
}
return path.concat(File.separator).concat("config");
}
}