法律不能使人人平等,但在法律面前人人平等
楔子
关于如何搭建SpringBoot工程以及开启Web功能,
可以查看我的这篇博客:用Spring Initializr快速构建SpringBoot及整合MVC
SpringBoot是Pivotal团队开发的Spring框架,整合了许多的框架,采用生产就绪的观点,旨在简化配置、快速开发。因此我们不需要做太多的配置就能使得SpringBoot程序正常运行,甚至号称"零配置",也就是所谓的"约定>配置"。但是在一些特殊情况下,我们需要有自己的配置或者修改一些配置,也就是说当我们违反了和SpringBoot的约定时,我们需要进行配置。
properties和yml
大家在用IDEA中的Spring Initializr创建一个SpringBoot工程时,其实系统会默认在src/main/java/resources目录创建一个配置文件application.properties
,当然SpringBoot也支持yml格式的配置文件,我们在实际开发中,也是以yml配置文件为主。这是为什么呢?我们先来看两段配置("#"为单行注释):
application.properties
:
server.port=80 #配置端口号
server.servlet.context-path=/taoBao #配置项目名
application.yml
:
server:
port: 80 #配置端口号
servlet:
context-path: /taoBao #配置项目名
经过对比可以发现,yml格式的文件层次感会更强一些,更加方便维护和管理。其实刚开始的时候,我也没太发现,主要是不习惯
自定义属性
YML中的value支持多种类型:字符串、数值、浮点数、List、Map集合…当我们需要的时候,我们也可以在配置文件application.yml
中自定义属性,如:
person:
name: guqueyue #字符串
age: 18 #数值
hobbies: #List集合
- Java
- 读书
- 辩论
address: #map集合
province: 江西省
city: 吉安市
配置文件中的自定义属性,也可以从配置文件中读取值,如:
man:
name: ${person.name} #从配置文件中读取值
或者我们也可以运用${random}
来生成各种不同类型的随机值,如:
my:
name: guqueyue
greeting: hi, I'm ${my.name}
number: ${random.int} #随机生成一个int类型的数值
uuid: ${random.uuid} #随机生成一个uuid
max: ${random.int(66)} #随机生成一个小于66的整数
value: ${random.value} #随机生成一个值
但是在配置过程中一定需要注意两点:
- 配置信息一定要注意缩进
- 冒号: 后必须要跟一个空格
单值读取
配置已经有了,那么我们怎么从application.yml
配置文件中读取属性值?
如,在配置文件application.yml
中配置:
person:
name: guqueyue #字符串
age: 18 #数值
man:
name: ${person.name} #从配置文件中读取值
其实我们只需要在变量上加@Value("${属性名}")
注解,即可将application.yml
配置文件的一个属性值赋给一个变量;若要单独给变量赋值,在变量上加上@Value("属性值")
注解即可,如:
@Value("guqueyue")
private String name;
但最好不要这样,毕竟SpringBoot的理念是配置>编码,能配置尽量配置,再新建一个controller,代码如下:
/**
* @author guqueyue
* @Date 2020/4/11
**/
@RestController
public class ManController {
@Value("${man.name}")
private String name;
@Value("${person.age}")
private int age;
@RequestMapping(value = "/man")
public void man() {
System.out.println("name: " + name + ", age:" + age);
}
}
打开浏览器,输入"http://localhost:8080/man",控制台打印如下:
即说明application.yml
配置文件中的属性man.name
和person.age
已经成功读取到了SpringBoot应用程序中!
多值读取
多值读取即将配置文件的属性赋值给实体类,如application.yml
中配置:
person:
name: guqueyue #字符串
age: 18 #数值
greeting: hi, I'm ${person.name} #从配置文件中读取值
hobbies: #List集合
- Java
- 读书
- 辩论
address: #map集合
province: 江西省
city: 吉安市
我们只需创建一个实体类,如"Person",如:
/**
* @author guqueyue
* @Date 2020/4/11
* 实体类
**/
@Data // lombok插件的注解,若未使用lombok插件,请自行生成getter、setter以及toString方法
@ConfigurationProperties(prefix = "person") // prefix - 前缀,必须跟配置中一致
@Component // 让这个类被SpringBoot扫描到
public class Person {
// 属性的名称和类型必须跟配置文件中的配置一一对应
private String name;
private Integer age;
private String greeting;
private List<String> hobbies;
private Map<String, String> address;
}
其中Person类上有一个注解,为@ConfigurationProperties
,表明该类为配置属性类,其中的前缀prefix
一定要和配置文件中的一致。另外@Component
注解,使得SpringBoot在启动时扫描到该类,即通过包扫描将该类作为一个Bean注入到IOC容器中。
还有一点需要注意,若是属性的名称跟配置文件中的配置不一致,需要再行配置,如"name"改为"myName",则需要再加注解:
@Value("${person.name}")
private String myName;
再新建一个controller用来读取 Person 类的属性,如:
/**
* @author guqueyue
* @Date 2020/4/11
**/
@RestController
public class PersonController {
@Autowired // 注入Person对象
private Person person;
@RequestMapping("/getPerson")
public Person getPerson() {
return person;
}
}
打开浏览器,输入"http://localhost:8080/getPerson",浏览器显示:
说明读取完成!
自定义配置文件
有时候可能我们需要配置的属性太多,若是都写在application.yml
配置文件中就有些不太合适,我们可以自定义配置文件。如在src/main/resources目录下自定义一个名为test.properties
的配置文件(不要采用yml格式),在文件中配置如:
com.user.name=guqueyue
com.user.password=123
也可以在配置文件中赋值:
com.man.name=${com.user.name}
虽然我不知道有什么用,但是我知道可以
最重要的是:通过@PropertySource
注解加载自定义配置文件!!!
单值读取
新建一个controller,如:
/**
* @author guqueyue
* @Date 2020/4/11
**/
@RestController
// 加载自定义配置文件
@PropertySource(value = "classpath:test.properties")
public class NameController {
@Value("${com.user.name}")
private String name;
@Value("${com.man.name}")
private String myName;
@RequestMapping("/name")
public void getName() {
System.out.println(name + "," + myName);
}
}
运行启动类中的main方法,打开浏览器,输入"http://localhost:8080/name",控制台打印如下:
读取成功!!!
多值读取
话不多说,直接创建实体类,如:
/**
* @author guqueyue
* @Date 2020/4/11
**/
@Data // lombok插件的注解,若未使用lombok插件,请自行生成getter、setter以及toString方法
@Configuration // 使SpringBoot扫到这个类,将这个类作为一个Bean注入IOC容器中
@PropertySource(value = "classpath:test.properties") // 加载自定义配置文件
@ConfigurationProperties(prefix = "com.user") // prefix - 前缀,必须和配置中一致
public class User {
private String name;
private String password;
}
其中@Configuration
注解包含@Component
注解,再新建一个controller,如:
/**
* @author guqueyue
* @Date 2020/4/11
**/
@RestController
public class UserController {
@Autowired // 注入user对象
private User user;
@RequestMapping(value = "/user")
public void getUser() {
System.out.println(user);
}
}
启动SpringBoot程序,打开浏览器,输入"http://localhost:8080/user",控制台打印如下:
说明自定义配置文件的属性被读取到了JavaBean中。
多环境下的配置文件
在我们实际的开发过程中,不同的环境下会有不同的配置文件,如:开发环境、测试环境、生产环境等。我们可以在配置文件application.yml
中指定不同环境下的配置文件,如配置文件的格式为application-{profile}.yml
,其中{profile}
为环境标识,例如:
-
application-dev.yml —— 开发环境
-
application-test.yml —— 测试环境
-
application-prod.yml —— 生产环境
则我们可以src/main/resources下新建application-dev.yml
、application-test.yml
以及application-prod.yml
三个配置文件,如图:
那么,我们该如何决定使用哪个环境下的配置文件呢?
例如,我们想使用开发环境下的配置文件application-dev.yml
,则在配置文件application.yml
中配置:
spring:
profiles:
active: dev
再在配置文件application-dev.yml
中配置一下端口号:
server:
port: 8762
运行SpringBoot程序,通过控制台打印的日志,得知应用程序的访问端口号已经由默认的"8080"变成了application-dev.yml
配置文件中的"8762",则说明配置已经生效了。