欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-24 12:55:47
[TOC] 配置文件 需求 针对不同环境下,可以配置不同的配置文件,如application dev.properties、application test.properties。 Spring环境 采用spring.profiles.active属性来区分不同的应用环境。 配置类 若spring. ......

配置文件

需求

针对不同环境下,可以配置不同的配置文件,如application-dev.properties、application-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            tablename        = "comm_log";
    //private string            logtype          = "lx2";
    private string            host;
    private int               port;
    private int               maxthreads       = 20;
    private int               savemode         = 0;
    private boolean           savelog          = true;
    private string            topic            = "topic_common_log";
    private string            defaulterrcode;
    private boolean           openintable      = false;
    private string            intablename;
    private string            remoteurl;
    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, "");
    }
    
}