Spring读取不同环境的自定义配置文件

2019-08-29 09:08:06来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Spring读取不同环境的自定义配置文件

目录

  • 配置文件
    • 需求
    • Spring环境
      • 配置类
      • PropertySourceFactory
    • 非Spring环境

配置文件

需求

针对不同环境下,可以配置不同的配置文件,如log-dev.properties、log-test.properties。

Spring环境

采用spring.profiles.active属性来区分不同的应用环境。

配置类

@Data
@Component
@ConfigurationProperties(prefix = "log")
@PropertySource(name = "log", value = "classpath:log-${spring.profiles.active:}.properties", factory = SystemPropertySourceFactory.class)
public class LogConfig implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private String            host;
    private int               port;
    private int               maxThreads       = 20;
    private int               saveMode         = 0;
    private boolean           saveLog          = true;
    private String            namesrvAddr;
    private String            producerGroupName;
    private String            instanceName;
    private int               sendTimeout;
}

若spring.profiles.active为空,则该值为空字符串。

PropertySourceFactory

/**
 * 针对自定义配置文件的一个多环境配置逻辑
 * 
 */
public class SystemPropertySourceFactory implements PropertySourceFactory {
    
    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource)
        throws IOException {
        String fileSuffix = "";
        try {
            String filename = resource.getResource().getFilename();
            fileSuffix = filename.substring(filename.lastIndexOf("."));
            resource.getResource().getFile();
            return new ResourcePropertySource(name, resource);
        } catch (Exception e) {
            InputStream inputStream = SystemPropertySourceFactory.class.getClassLoader()
                .getResourceAsStream(name + fileSuffix);
            //转成resource
            InputStreamResource inResource = new InputStreamResource(inputStream);
            return new ResourcePropertySource(new EncodedResource(inResource));
        }
    }
    
}

若spring.profiles.active=dev有配置,但是没有这个配置文件(例:log-dev.properties),则默认读取log.properties。若spring.profiles.active无配置,则默认读取log.properties。

非Spring环境

思路:将spring.profiles.active 属性设置到System环境变量。则非Spring环境可从System环境变量中获取该值。

@Component
public class ServerInfo implements ApplicationListener<WebServerInitializedEvent> {
    private static final String SPRING_PROFILES_ACTIVE = "spring.profiles.active";
    
    @Override
    public void onApplicationEvent(WebServerInitializedEvent event) {
        //设置系统变量
        System.setProperty(SPRING_PROFILES_ACTIVE, this.getProfileActive());
    }
    
    /**
     * 获取spring.profiles.active属性值
     * @return
     */
    public String getProfileActive() {
        return env.getProperty(SPRING_PROFILES_ACTIVE, "");
    }
    
}

原文链接:https://www.cnblogs.com/chenzuyibao/p/11425046.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:springboot自动配置原理

下一篇:HashMap、HashTable 和 ConcurrentHashMap 线程安全问题