Spring Boot 基础知识 配置文件多环境配置

编程语言 12/26 阅读 1126 views次 人气 0
摘要:

 SpringBoot 基础知识学习(二)——配置文件多环境配置

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  通过上一篇《Spring Boot 基础知识学习(一)——快速入门》我们知道SpringBoot使用默认配置来简化配置,但是在实际使用时,我们需要更改配置咋办呢?比如,我们需要把服务启动端口改成8081?

        SpringBoot的配置文件有两种格式,一种是properties,另外一种是yml,由于properties比较简单,本篇用此格式的配置文件做举例(在我们PaaS平台中是用的yml,后面会有一篇介绍yml的使用)。

二、配置文件

     Spring Boot的默认配置文件为application.properties或者application.yml。

(1)   修改服务端口

        这个比较简单,在*.properties文件中添加“server.port=8081”,可以观察控制台查看服务启动的端口,具体配置如下所示:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        除了上面这种设置服务启动端口的方式,我们还可以通过命令行设置值,通过这条命令:java -jar xxx.jar --server.port=8082,通过使用–server.port属性来设置xxx.jar应用的端口为8082。那么问题来了,我同时使用配置文件和命令行,会怎么样呢?会不会程序挂掉或者使用其中的一种呢?这就引出另外一个问题:配置文件的生效顺序或者说他们的优先级。

(2)   配置的优先级

         Spring Boot 所提供的配置优先级顺序比较复杂。按照优先级从高到低的顺序,具体的列表如下所示:

A、命令行参数

B、 通过System.getProperties() 获取的 Java 系统参数

C、 操作系统环境变量

D、 从 java:comp/env 得到的 JNDI 属性

E、 通过RandomValuePropertySource 生成的“random.*”属性

F、 应用 Jar 文件之外的属性文件。(通过spring.config.location参数)

G、应用 Jar 文件内部的属性文件

H、 在应用配置 Java 类(包含“@Configuration”注解的 Java 类)中通过“@PropertySource”注解声明的属性文件。

I、  通过“SpringApplication.setDefaultProperties”声明的默认属性。

(3)   自定义配置属性与加载

        我们进行Spring Boot应用程序开发的时候,除了其本身的一些属性配置外,可能还存在一些自定义的属性需要配置和读取,那么其是怎么做的,有两种方式:通过@Value("${属性名}")注解来加载对应的配置属性或者使用environment.getProperty()方法根据key获取value,具体代码(源代码的地址为:https://github.com/dreamerkr/SpringBoot)如下所示:

A、配置文件application.properties

srd.regProtocol:etcd
srd.addresses:10.15.15.119:12379

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

B、使用@value注解获取配置属性的值

@Component
public class DiscoveryConfig {
    //类型(zk或者etcd)
    @Value("${srd.regProtocol}")
    private String regProtocol;
   
    //注册地址
    @Value("${srd.addresses}")
    private String address;
    //省略getter和setter
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

C、使用environment.getProperty()方法根据key获取value

@RestController
public class HelloController {
    @Autowired
    private Environment environment;
   
    @RequestMapping("/hello")
    public String sayHello(){
        return "Hello World "+environment.getProperty("spirng.application.name");
}
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

D、编写单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes={DemoApplication.class})
public class DemoApplicationTests {s
    @Autowired
    private DiscoveryConfig config;
 
    @Test
    public void getConfigTest() throwsException {
         Assert.assertEquals(config.getRegProtocol(), "etcd");
         Assert.assertEquals(config.getAddress(), "10.15.15.119:12379");
}
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

三、多配置文件

         我们在使用Spring Boot开发应用或者服务时,通常同一个应用程序或者服务会部署到不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。对于多个环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也是通过profile来实现的。

        在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:application-dev.properties:开发环境,application-test.properties:测试环境等。至于哪个具体的配置文件会被加载,有三种方式:

(1)    使用@PropertySource注解

         直接在启动类上使用@PropertySource注解来加载不同的配置文件,具体如下所示:

(2)    修改spring.profiles.active属性

         需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值,如:spring.profiles.active=dev就会加载application-dev.properties配置文件内容,具体如下所示:

(3)    执行命令行

         如上面介绍所讲的一样,我们可以使用命令行,比如执行java -jar xxx.jar --spring.profiles.active=test,可以观察到服务端口被设置为8082,也就是测试环境的配置(test)。

总结

         通过上面,三种不同执行方式,我们也可以发现配置文件的优先级,优先级高的配置或覆盖优先级低的配置,同时公共配置属性放到application.properties,私有的配置属性放在application-{profile}.properties文件中。

小奋斗文章

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

评论

该文章不支持评论!

分享到: