目录

  • 一 使用IDEA新创建SpringBoot项目
  • 二 默认配置的修改与值的注入
  • 2.1 通过application.properties文件修改
  • 2.2 通过application.yml文件修改
  • 2.2.1 yaml介绍
  • 2.2.2 yaml语法介绍
  • 2.2.3 yaml常用写法举例
  • 2.3 配置文件值的注入
  • 2.3.1 使用@Value获取单个值
  • 2.3.2 使用@ConfigurationProperties将属性值绑定到类中
  • 2.3.3 数据校验
  • 2.3.4 注入application.properties配置文件的值
  • 2.3.5 @ConfigurationProperties、@Value用法总结
  • 2.3.6 模块化配置文件
  • 三 自定义配置的支持
  • 3.1 使用XML配置文件装配Bean到Spring容器
  • 3.2自定义Java配置类装配Bean到Spring容器
  • 四 多环境的支持
  • 4.1 直接在主配置文件中指定
  • 4.2 打包成jar包,并在启动程序时指定
  • 4.2.1 生成jar包
  • 4.2.2 指定启动参数启动程序
  • 五 配置文件加载位置以及加载顺序


一 使用IDEA新创建SpringBoot项目

1.file->new->project

springboot 从配置文件中获取map springboot获取配置文件的参数_Java


2.弹出以下界面

springboot 从配置文件中获取map springboot获取配置文件的参数_Spring_02


选择Spring Initializr,注意,这里需要选择大于等于1.8的SDK版本。3.点击next后弹出以下界面

springboot 从配置文件中获取map springboot获取配置文件的参数_Spring_03


Group:一般写com.公司名称

Artifact:项目名,同Name

Type:默认(Maven Project)

Language:Java

Packaging:jar

Java Version:选择合适的SDK版本,注意不小于1.8

Version:项目版本号

Description:项目说明

Package:默认生产的包名4.所有的选项填完后如下

springboot 从配置文件中获取map springboot获取配置文件的参数_配置文件_04


5.点击next后弹出下面的界面,并按照如下选择

springboot 从配置文件中获取map springboot获取配置文件的参数_Spring_05


6.点击next后弹出以下界面,选择合适的项目存储位置

springboot 从配置文件中获取map springboot获取配置文件的参数_Web开发_06


7.点击next,完成项目的创建

springboot 从配置文件中获取map springboot获取配置文件的参数_配置文件_07


在这里如果弹出Import Change的提示的话,注意点击一下,此操作会导入Spring默认依赖包。

8.项目工程树如下

springboot 从配置文件中获取map springboot获取配置文件的参数_配置文件_08


至此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)看一下:

springboot 从配置文件中获取map springboot获取配置文件的参数_配置文件_09


springboot 从配置文件中获取map springboot获取配置文件的参数_SpringBoot_10


springboot 从配置文件中获取map springboot获取配置文件的参数_Spring_11


浏览器成功出现Hello时,证明SpringBoot项目跑起来了。

二 默认配置的修改与值的注入

2.1 通过application.properties文件修改

SpringBoot默认的全局配置文件放在src/mainresources目录下。如果想要修改SpringBoot的默认配置,可以在application.properties中修改SpringBoot的默认配置。
以修改默认端口号为例:
application.properties添加以下代码:

server.port=6666

再启动一下服务,发现端口号已经变了

springboot 从配置文件中获取map springboot获取配置文件的参数_Spring_12

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

效果图:

springboot 从配置文件中获取map springboot获取配置文件的参数_Web开发_13

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;
    }
}

效果:

springboot 从配置文件中获取map springboot获取配置文件的参数_Web开发_14

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);
    }

}

启动测试类,可以看到控制台成功输出:

springboot 从配置文件中获取map springboot获取配置文件的参数_Web开发_15


细心的朋友可能会看到,打印出的isManager属性并不是我们在配置文件中的属性,这是两个方面导致的。这是由两个方面导致的:

  1. 使用IDEA自动生成getter/setter方法时会针对属性名为isXXX的成员属性做特殊处理,setter方法名会写为setXXX(去掉了Is)。
  2. SpringBoot注入某个属性的值时,会去寻找set属性名 方法,调用此方法注入值。

根据上面的分析我们可以知道,在注入isManager属性时,SpringBoot没有找到setIsManager方法,所以就没有注入进去。

修改isManager属性的Setter方法后再测试一下:

public void setIsManager(boolean manager) {
        isManager = manager;
    }

可以看到,注入了正确的值:

springboot 从配置文件中获取map springboot获取配置文件的参数_配置文件_16

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

详细信息

@Email

被注释的元素必须是电子邮箱地址

@Length

被注释的字符串的大小必须在指定的范围内

@NotEmpty

被注释的字符串的必须非空

@Range

被注释的元素必须在合适的范围内

接下来我们就来验证一下:
假设,我们指定最低工资不得低于2000,代码如下:

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "employee")
@Validated
public class Employee {
    ...
    //薪资
    @Min(2000)
    private Double salary;
    ...
}

这里除了引用JSR303中的@Min注解外,还对整个类使用了@Validated注解进行修饰,@Validated作用用于开启数据校验。

当我们故意在配置文件中输入一个小于2000的薪资后,启动测试程序可以看到控制台打印出了错误信息:

springboot 从配置文件中获取map springboot获取配置文件的参数_Web开发_17

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显然有些不合理。此时就需要将配置文件合理的拆分开来。
还是以上面的例子进行演示:

  1. 首先屏蔽掉所有和employee有关的配置
  2. 在资源文件路径下创建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
  1. 在主配置文件中包含新创建的配置文件:
spring:
  profiles:
    include: employee-conf

最后看一下效果:

springboot 从配置文件中获取map springboot获取配置文件的参数_配置文件_18

注: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();
    }
}

运行测试类,效果如下:

springboot 从配置文件中获取map springboot获取配置文件的参数_Java_19


可以看到,控制台成功输出了我们想要的结果,由此可以得知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();
    }
}

可以看到成功打印出了我们想要的内容。

springboot 从配置文件中获取map springboot获取配置文件的参数_Java_20

四 多环境的支持

在实际的项目中,我们往往需要区分开发环境和生产环境。例如:开发环境和生产环境配置不同的端口号;开发环境禁用资源文件缓存,生产环境不禁用;开发环境开启自动部署,生产环境不开启。。。
针对开发环境和生产环境,就需要我们为此指定不同的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

springboot 从配置文件中获取map springboot获取配置文件的参数_配置文件_21


切换到生产环境后,端口号是8888

springboot 从配置文件中获取map springboot获取配置文件的参数_Java_22

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:/

类路径的根目录,最低优先级

加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,高优先级的内容会覆盖底优先级的内容,形成互补配置。