赞
踩
源码地址:SpringBoot_demo
本篇文章内容源码位于上述地址的
com/chenshu/springboot_demo/config
包下
上节说到,Spring Boot的项目分为三个部分:源代码目录、资源目录、单元测试目录。
而配置文件的位置就位于资源目录resources
的第一级,名为application.properties
,可见配置文件于Spring Boot项目的重要性:
上一篇文章提到了Spring Boot约定大于配置的思想,这里就能够体现:它的命名只能是application.xxx
。
整个项目中所有重要的数据都是在配置文件中配置的,比如:
配置文件主要分为以下两种格式:
以配置项目的启动端口号为例:
它的语法特别简单,也就是"键"=“值”
server.port=8080
观察一下它的键"server.port",类似于java中导包时用来区分不同的包下的类(把server看成包,把port看作类)
该格式可以说是properties格式的升级,yml格式则是更改了键的形式,键的级别之间用':' + '\n' + '\t'
分割,值和键之间必须用':' + '空格'
分割
server:
port: 8081
两种格式的配置文件可以共存在一个项目中,当一个项目有两种格式的配置文件的时候,会先去读取application.properties文件,再去读取application.yml文件,前者的优先级最高。也就是说两个文件中都配置了"server.port"这一个键的话,那么会以.properties中的配置为主
server.port=8888
server:
port: 9999
但是实际开发中通常会使用统一的配置文件格式,这样可以更方便的维护。
在application.properties和application.yml中都可以通过'#'
来写注解:
# 设置端口号
server.port=8888
但是在application.properties默认是以ISO-8859-1
来编码的,而idea默认是以utf-8
来解码的,有中文的情况下,如果关闭了项目下次再打开就会变成乱码:
关闭idea,并重新打开该项目:
1、关闭项目
2、更改所有设置
3、更改.properties的编码方式
4、点击Apply+OK,这样设置完之后的项目的properties文件就都是以utf-8来编码的了,当前项目的话还需自己手动打开当前项目的设置,其他步骤和上述一样:
这里使用yaml的格式,简单看看,后续都会用到:
# 配置启动端口号 server: port: 9999 # 配置数据库的连接字符串 spring: datasource: url: jdbc:mysql://localhost:3306/blog_system?characterEncoding=utf8&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver # 配置日志输出信息 logging: level: com: example: demo: debug
更多配置点这:Spring Boot 各种配置项
配置文件内容分类:
我们可以自行定义配置项(下面用properties来定义,yml同理):
# 用户自定义配置项
mykey.key1=chenshu
读取配置文件中的值:
想要读取配置文件中的值,需要在类的字段上添加一个@Value
注解,@Value注解中的参数必须要使用${}
将键包裹起来,如读取键为mykey.key1
的值就这样写:@Value("${mykey.key1}")
@RestController
public class TestController {
//读取配置文件中的值
@Value("${mykey.key1}")
private String myKey;
//配置路由
@RequestMapping("/getkey")
public String getMyKey() {
return myKey;
}
}
浏览器中搜索该方法的路由:
yml是YAML的缩写,全称为Yet Another Markup Language(另一种标记语言)
在开发中更推荐使用yml,举个例子:
application.properties
有下面配置:
# 数据库的连接配置
# 数据库的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/druid_test?characterEncoding=utf8
# 数据库username
spring.datasource.username=root
#数据库password
spring.datasource.password=root
在application.yml
中是下面这样:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/druid_test?characterEncoding=utf8
username: root
password: root
spring.datasource
配置文件:
mykey:
key1: I am \n Chenshu
key2: 'I am \n Chenshu'
key3: "I am \n Chenshu"
测试代码:
@RestController public class TestController { @Value("${mykey.key1}") private String myKey1; @Value("${mykey.key2}") private String myKey2; @Value("${mykey.key3}") private String myKey3; //配置路由 @RequestMapping("/getkey") public void getMyKey() { System.out.println(myKey1); System.out.println(myKey2); System.out.println(myKey3); } }
输出结果:
I am \n Chenshu
I am \n Chenshu
I am
Chenshu
yml配置对象属性支持两种写法:
原始写法:
User:
id: 1
name: zhangsan
age: 20
行内写法:
User: {id: 1, name: zhangsan, age: 20}
public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + ''' + ", age=" + age + '}'; } }
@Component
的基础上,还要添加@ConfigurationProperties(prefix = "user")
:@Component
@ConfigurationProperties(prefix = "user")
public class User {
TestController
中注入依赖:@Autowired
private User user;
@RequestMapping("/getuser")
public String getUser() {
return "Hi, " + user;
}
注意事项:
@ConfigurationProperties(prefix = "user")
,表示从配置文件中读取键为"user"的对象,将对象中的字段赋值给Bean,其实就跟传统的Spring中的通过配置文件的setter属性注入是一样的,该注解必须要有setter方法,通过setter方法注入值,否则会报错,把setAge()
屏蔽后启动项目会失败:@ConfigurationProperties(prefix = "user")
的作用只是赋值,setter()方法使用的前提是有这个对象。Property: user.age
Value: "20"
Origin: class path resource [application.yml] - 15:36
Reason: java.lang.IllegalStateException: No setter found for property: age
7.3
讲到的配置对象属性只能配置基本类型,如int,String
等,其实配置集合也是配置对象属性的一种,不过属性由基本类型变成了list集合,yml配置list集合同样支持两种写法:
原始写法:
dbtypes:
name:
- mysql
- sqlserver
- sqlite
行内写法:
dbtypes: {name: [mysql,sqlserver,sqlite]}
@Data
注解,作用是省去了编写setter、getter以及toString方法):@Data
public class DBTypes {
private List name;
}
@Component
的基础上,还要添加@ConfigurationProperties(prefix = "dbtypes")
:@Data
@Component
@ConfigurationProperties(prefix = "dbtypes")
public class DBTypes {
private List name;
}
TestController
中注入依赖:@Autowired
private DBTypes dbTypes;
@RequestMapping("/getdb")
public String getDBTypes() {
return "Hi, " + dbTypes;
}
在实际开发中涉及到多环境的开发,如:
而不同环境需要使用不同的配置文件设置(如不同的环境需要连接不同的数据库),通过多环境的配置文件设置,就不用再通过单一的配置文件改来改去了。
Spring Boot的约定大于配置,它们的命名也是有约定的,命名方式为:application-xxx.yml
(其中只有xxx是可以修改的)
我在resources目录下新增了这三个配置文件,分别代表三种开发环境:
这里我们把application.properties文件给忽视掉,resources目录下只有四个配置文件,此时application.yml是主配置文件
我在三种环境的配置文件中分别设置了启动端口为:8001、8002、8003,并且连接了不同的数据库:
application-dev.yml:
# 开发环境的配置文件
server:
port: 8001
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/dev?characterEncoding=utf8
username: root
password: root
application-test.yml:
# 测试环境的配置文件
server:
port: 8002
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
username: root
password: root
application-prod.yml:
# 生产环境的配置文件
server:
port: 8003
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/prod?characterEncoding=utf8
username: root
password: root
然后在主配置环境中设置运行环境为开发环境,这样Spring Boot项目在读配置文件的时候会读取主配置文件+设置的运行环境的配置文件
的内容:
application.yml:
# 运行环境设置
spring:
profiles:
active: dev
发现确实是以application-dev.yml
的配置文件中设置的启动端口号启动项目:
总结:在实际开发中可以把公共的配置写在主配置文件application.yml
中,不同开发环境下需要不同的设置再分别写入application-xxx.yml
中,并且在主配置文件中设置相应的运行环境,以实现多环境的配置文件设置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。