一 使用IDEA新创建SpringBoot项目
1.file->new->project
2.弹出以下界面
选择Spring Initializr,注意,这里需要选择大于等于1.8的SDK版本。
3.点击next后弹出以下界面
Group:一般写com.公司名称
Artifact:项目名,同Name
Type:默认(Maven Project)
Language:Java
Packaging:jar
Java Version:选择合适的SDK版本,注意不小于1.8
Version:项目版本号
Description:项目说明
Package:默认生产的包名
4.所有的选项填完后如下
5.点击next后弹出下面的界面,并按照如下选择
6.点击next后弹出以下界面,选择合适的项目存储位置
7.点击next,完成项目的创建
在这里如果弹出Import Change的提示的话,注意点击一下,此操作会导入Spring默认依赖包。
8.项目工程树如下
至此SpringBoot项目就创建好了。
9.编写Controller试一下,看项目能否正常运行。
new—>java Class,取名为controller.HelloController,代码如下:
package com.yky.springbootconfig.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@RequestMapping(value = "/hello")
@ResponseBody
public String Hello()
{
return "Hello";
}
}
10.启动工程,并访问localhost:8080/hello(默认端口号8080)看一下:
浏览器成功出现Hello时,证明SpringBoot项目跑起来了。
二 默认配置的修改与值的注入
2.1 通过application.properties文件修改
SpringBoot默认的全局配置文件放在src/mainresources目录下。如果想要修改SpringBoot的默认配置,可以在application.properties中修改SpringBoot的默认配置。
以修改默认端口号为例:
application.properties添加以下代码:
server.port=6666
再启动一下服务,发现端口号已经变了
2.2 通过application.yml文件修改
准备工作:在src/mainresources目录下新创建application.yml文件。
2.2.1 yaml介绍
- 以数据为中心,在视觉上更具有面向对象的特性。
- 相比于JSON、XML更加简洁明了,在能使用yml配置文件的情况下,推荐使用此配置文件。
2.2.2 yaml语法介绍
-
基本形式:
key: value [键值对形式。注意,’:'后面必须要有空格或table]
-
层级关系的表示:
使用缩进来表示层级关系,推荐使用table进行缩进。
-
还是修改端口号的例子:
注:为了看到效果,可以把先前在application.properties中写的配置端口号的代码屏蔽掉。server: port: 8088
效果图:
2.2.3 yaml常用写法举例
-
数值、boolean、日期,直接写,无需加引号
salary: 20000 entryDate: 2019/11/26 isManager: true
-
字符串
可以加引号,也可以不加。引号可以使用单引号,也可以使用双引号。加双引号时会将转义字符转义输出,加单引号时,将转义字符原样输出。StringValue1: Hello Wolrd #输出Hello 换行 World StringValue2: "Hello \n World" #输出Hello \n World StringValue3: 'Hello \n World'
-
对象/Map
employee: salary: 20000 entryDate: 2019/11/26 isManager: true
写在一行
employee1: {salary: 20000, entryDate: 2019/11/26, isManager: true}
-
List/Set
用 ‘-’ 表示数组或Set集合中的一个元素。speciality: - c - c++ - Java - Shell
写到一行
speciality1: [c, c++, Java, Shell]
2.3 配置文件值的注入
2.3.1 使用@Value获取单个值
在application.yml配置文件中添加以下代码:
name: wuhua
在HelloController中使用Value注解获取配置文件中的name值:
@Controller
public class HelloController {
@Value("${name}")
private String name;
@RequestMapping(value = "/hello")
@ResponseBody
public String Hello()
{
return "Hello " + name;
}
}
效果:
2.3.2 使用@ConfigurationProperties将属性值绑定到类中
在要在配置文件中获取的值不多时,可以用@Value注解来获取单个值。可当一旦要获取的值比较多时,使用@Value注解就不太合适了。SpringBoot 为我们提供了@ConfigurationProperties注解,用于将配置文件中的属性值绑定到类中。
有entity.Employee类,代码如下:
public class Employee {
//姓名
private String name;
//工号
private Integer number;
//薪资
private Double salary;
//入职日期
private Date entryDate;
//特长
private List speciality;
//是否是管理人员
private boolean isManager;
getter/setter方法.......
toString方法......
}
在application.yml文件中添加以下代码:
employee:
name: Peter
number: 1
salary: 21000.5
entryDate: 2019/11/26
speciality:
- c
- c++
- Java
- Shell
isManager: true
接下来要做的就是将配置文件中的值注入到Employee类中
添加以下三行注解:
@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "employee")
public class Employee {
......
}
其中:
@Component:将Employee类注入Spring IOC容器,交由Spring容器管理
@EnableConfigurationProperties:使能,不加这句话的话可能读取不到配置
@ConfigurationProperties(prefix = “employee”):告诉SpringBoot要从哪里读取值,并进行一一绑定
用测试类测试一下:
@SpringBootTest
class SpringBootConfigApplicationTests {
@Autowired
private Employee employee;
@Test
void contextLoads() {
System.out.println(employee);
}
}
启动测试类,可以看到控制台成功输出:
细心的朋友可能会看到,打印出的isManager属性并不是我们在配置文件中的属性,这是两个方面导致的。这是由两个方面导致的:
- 使用IDEA自动生成getter/setter方法时会针对属性名为isXXX的成员属性做特殊处理,setter方法名会写为setXXX(去掉了Is)。
- SpringBoot注入某个属性的值时,会去寻找set属性名 方法,调用此方法注入值。
根据上面的分析我们可以知道,在注入isManager属性时,SpringBoot没有找到setIsManager方法,所以就没有注入进去。
修改isManager属性的Setter方法后再测试一下:
public void setIsManager(boolean manager) {
isManager = manager;
}
可以看到,注入了正确的值:
2.3.3 数据校验
在使用@ConfigurationProperties注解将配置与类进行绑定时,支持JSR303数据校验(@Value不支持)。
表 1. Bean Validation 中内置的 constraint
Constraint | 详细信息 |
---|---|
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
表 2. Hibernate Validator 附加的 constraint
Constraint | 详细信息 |
---|---|
被注释的元素必须是电子邮箱地址 | |
@Length | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串的必须非空 |
@Range | 被注释的元素必须在合适的范围内 |
接下来我们就来验证一下:
假设,我们指定最低工资不得低于2000,代码如下:
@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "employee")
@Validated
public class Employee {
...
//薪资
@Min(2000)
private Double salary;
...
}
这里除了引用JSR303中的@Min注解外,还对整个类使用了@Validated注解进行修饰,@Validated作用用于开启数据校验。
当我们故意在配置文件中输入一个小于2000的薪资后,启动测试程序可以看到控制台打印出了错误信息:
2.3.4 注入application.properties配置文件的值
注入application.properties配置文件的值与注入application.yml的值极为相似,不同的只是配置文件的写法不同。
还是以上面的例子为例,上面的例子在application.properties中的写法为:
employee.name=Peter
employee.number=1
employee.salary=21000.5
employee.entry-date=2019/11/26
employee.speciality=c,c++,Java,Shell
employee.isManager=true
2.3.5 @ConfigurationProperties、@Value用法总结
- 批量注入,推荐用@ConfigurationProperties
- 希望支持数据校验,用@ConfigurationProperties
- 数据量不多,并且各个属性没有关联时,用@Value
- @Value支持SpEL(Spring Expression Language),如果想要使用SpEL则使用@Value
2.3.6 模块化配置文件
当配置项比较多时,全部写在application.properties/application.yml显然有些不合理。此时就需要将配置文件合理的拆分开来。
还是以上面的例子进行演示:
-
首先屏蔽掉所有和employee有关的配置
-
在资源文件路径下创建application-employee-conf.yml文件,并写入以下内容(注:必须要以application-开头)
employee: name: george number: 2 salary: 20000 entryDate: 2019/11/26 speciality: - c - c++ - Java - Shell - css - JavaScript isManager: false
-
在主配置文件中包含新创建的配置文件:
spring: profiles: include: employee-conf
最后看一下效果:
注:xxx.properties配置文件的拆分和xxx.yml类似。在这里就不做演示了。
三 自定义配置的支持
3.1 使用XML配置文件装配Bean到Spring容器
SpringBoot提倡零配置,但在开发中难免有一些特殊场景需要用到xml配置。好在SpringBoot为我们提供了@ImportResource注解。
在SpringBoot启动入口类上添加@ImportResource注解:
@ImportResource(locations = "classpath:config.xml")
@SpringBootApplication
public class SpringBootConfigApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootConfigApplication.class, args);
}
}
注:xml文件不要以application开头,否则会出错!
@ImportResource(locations = “classpath:config.xml”)的作用是加载类路径下的config.xml文件。
为了方便测试,我们创建一个service.EmployeeService类,代码如下:
package com.yky.springbootconfig.service;
public class EmployeeService
{
public void save()
{
System.out.println("保存数据到数据库");
}
}
接下来在config.xml文件中将EmployeeService添加到Spring容器中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="employeeService" class="com.yky.springbootconfig.service.EmployeeService">
</bean>
</beans>
在测试类中获取Spring容器中的EmployeeService对象
@SpringBootTest
class SpringBootConfigApplicationTests {
@Autowired
private EmployeeService employeeService;
@Test
public void employeeServiceTest()
{
employeeService.save();
}
}
运行测试类,效果如下:
可以看到,控制台成功输出了我们想要的结果,由此可以得知EmployeeService被成功添加到了Spring容器中,我们的自定义xml配置文件起到了作用。
3.2自定义Java配置类装配Bean到Spring容器
针对Spring装配Bean,Spring官方推荐优先使用注解进行装配。就像我们常用到的@Component、
@Repository 、@Controller。而后是使用Java配置类进行装配,最后才用xml进行装配。接下来来看一看如何用Java配置类装配Bean吧。
- 第一步:使用@Configuration注解声明当前类为Spring配置类
- 第二步:使用@Bean注解修饰方法,被修饰的方法的返回对象将被装配到SpringIOC容器中
- Bean id默认为方法名。
- Spring不关系对象是如何在方法内创建的,只需要该方法正确返回要装配的对象就好了。
接来下验证一下:
1.创建service.UserService类,代码如下:
public class UserService {
public void login()
{
System.out.println("登陆成功");
}
}
2.创建configuration.UserServiceConfiguration类代码如下
@Configuration
public class UserServiceConfiguration
{
@Bean
public UserService userService()
{
return new UserService();
}
}
3.在测试类中获取UserService对象
@SpringBootTest
class SpringBootConfigApplicationTests {
@Autowired
private UserService userService;
@Test
public void userServiceTest()
{
userService.login();
}
}
可以看到成功打印出了我们想要的内容。
四 多环境的支持
在实际的项目中,我们往往需要区分开发环境和生产环境。例如:开发环境和生产环境配置不同的端口号;开发环境禁用资源文件缓存,生产环境不禁用;开发环境开启自动部署,生产环境不开启。。。
针对开发环境和生产环境,就需要我们为此指定不同的profile配置了。
4.1 直接在主配置文件中指定
SpringBoot可以通过在主配置文件(application.properties或application.yml)中指定spring.profiles.active的值来指定当前是开发环境还是生产环境。
#dev表示开发环境,prod表示生产环境
spring:
profiles:
active: dev
- 当指定为dev时,SpringBoot会在配置文件所在路径下查找application-dev.yml文件,并将其作为配置文件包含进来。
- 当指定为prod时,SpringBoot会在配置文件所在路径下查找application-prod.yml文件,并将其作为配置文件包含进来。
接下来我们创建这两个配置文件,并在这两个配置文件中分别指定不同的端口号。
可以看到,在开发环境下端口号是6666
切换到生产环境后,端口号是8888
4.2 打包成jar包,并在启动程序时指定
在4.1中讲了如何在主配置文件中指定当前的环境是开发还是生产环境。在每次切换环境时,还要手动修改配置文件,略显麻烦。其实还有可以在程序运行时通过传入参数指定。
4.2.1 生成jar包
- 通过控制台进入项目根目录
- 运行mvn clean package命令将项目打包成jar包
通过控制台输出的信息得知jar包输出到了./target
4.2.2 指定启动参数启动程序
- 以开发环境启动
java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
- 以生产环境启动
java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
- 说明
启动参数指定当前运行环境的优先级>主配置文件中指定运行环境的优先级,即不管主配置文件中指定的运行环境是什么,只要在启动参数中指定了,就按启动参数中指定的来。
五 配置文件加载位置以及加载顺序
springboot启动会扫描以下位置的application.properties或者application.yml作为默认的配置文件
位置 | 说明 |
---|---|
工程根目录:./config/ | 工程根目录的config路径下,最高优先级 |
工程根目录:./ | 工程根目录 |
classpath:/config/ | 类路径的config目录下 |
classpath:/ | 类路径的根目录,最低优先级 |
加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,高优先级的内容会覆盖底优先级的内容,形成互补配置。
关于SpringBoot的配置文件相关知识点就介绍到这儿了,如果有错误或遗漏的地方欢迎在评论区指出。