Spring Boot (5) Spring Boot配置详解
application.properties
application.properties是spring boot默认的配置文件,spring boot默认会在以下两个路径搜索并加载这个文件
src\main\resources
src\main\resources\config
配置系统参数
在application.properties中可以配置一些系统参数,spring boot会自动加载这个参数到相应的功能,如下
#端口,默认是8080 server.port=8088 #访问路径,默认为/ server.servlet.context-path=/test
测试:http://localhost:8088/test/hello
推荐使用yaml文件,后缀为yml
server: port: 8088 servlet: context-path: /test
注意冒号:后面有个空格 好处就是简洁 不用重复的写前缀 只保留一种即可,删掉properties
applicaiton.properties配置中文值的时候读取的时候会出现乱码问题,而yml不会
如果在定义user.name=xxx的时候也是读取不到的,因为spring boot首先会加在sytemEnvironment作为首个PropertySource mac会返回自己的登录账号
自定义properties文件
在spring boot启动类或配置类中添加以下注解,可再启动时载入自定义的配置文件
@PropertySource("classpath:config/xxx.properties")
如果要同时载入多个文件就用数组
@PropertySource(value={"classpath:config/a.properties","classpath:config/b.properties"})
自定义参数
新增a.properties
key1=values1
key2=values2
然后再java代码中使用@Value注解,在项目启动时会将自定义参数加载到全局变量。
@RestController //引入spring boot的web模块,就会自动配置web.xml等于web相关的内容 @PropertySource("classpath:a.properties") public class HelloController { @Autowired String testStr; @Value("${key1}") String key1; @RequestMapping("/hello") public String hello(){ return testStr+":"+key1; } }
访问:http://localhost:8088/test/hello
显示:Hello World:values1
批量注入到类变量
在a.properties中配置几个以user为前缀的参数
key1=values1 key2=values2 user.Id=4 user.userName=shabaidaweia user.age=183
在java中用@ConfigurationProperties 将以user为前缀的参数注入到当前类的变量中,需要有set方法。
package com.spring.boot.utils; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "user") public class UserProperties { private Integer Id; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } private String userName; private String age; public Integer getId() { return Id; } public void setId(Integer id) { Id = id; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
在controller中使用配置文件即可
@RestController public class HelloController { @Autowired private UserProperties userProperties; @GetMapping("/name") public String name(){ return userProperties.getUserName(); } }
参数引用
在properties中的各个参数之间也可以相互引用如下:
com.xxx.name=david com.xxx.age=18 com.xxx.sayHi=${com.xxx.name}今年${com.xxx.age}岁了
多环境配置
我们在开发spring boot时,通常一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口、支付账号等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常痛苦的事情。
在spring boot中多环境配置文件名需要满足 application-{profile}.properties格式,其中{profile}对应你的环境标识:
application-dev.properties 开发环境
application-test.properties 测试环境
application-prod.properties 生产环境
具体哪个配置文件会被加在,需要在application.properties中通过spring.profiles.active属性来设置,其值对应{profile}值。
如 spring.profiles.active=test 就会加在test.properties配置文件的内容
application.yml
spring:
profiles:
active: dev #指定读取哪个文件
application-dev.yml
server: port: 8088 servlet: context-path: /dev
application-prod.yml
server: port: 8088 servlet: context-path: /
application-test.yml
server: port: 8088 servlet: context-path: /test
启动项目:http://localhost:8088/dev/name
通过命令行设置属性值
通过java -jar xx.jar 启动项目时 可以输入 java -jar xx.jar --server.port = 8888 ,来设置xxx.jar对应的端口。
在命令行运行时,连续的两个减号 -- 就是对application.properties属性值进行赋值,所以这个命令等价于我们在application.properties中设置server.port=8888。
可以设置SpringApplication.setAddCommandLineProperties(false)。来进行屏蔽命令行设置参数
打开终端:进入项目目录,执行 mvn package 打包
或者在idea下方 Terminal中输入
打包完成后 进入target目录中,发现一个名为boot.war包
输入命令 java -jar boot-0.0.1-SNAPSHOT.war
访问:http://localhost:8088/dev/name shabaidaweia
再打开一个终端:
java -jar boot-0.0.1-SNAPSHOT.war --user.username=666 --server.port=8888
访问:http://localhost:8888/dev/name
显示:666