SpringBoot学习篇1[配置文件知多少]

一 使用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属性并不是我们在配置文件中的属性,这是两个方面导致的。这是由两个方面导致的:

  1. 使用IDEA自动生成getter/setter方法时会针对属性名为isXXX的成员属性做特殊处理,setter方法名会写为setXXX(去掉了Is)。
  2. 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详细信息
@Email被注释的元素必须是电子邮箱地址
@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显然有些不合理。此时就需要将配置文件合理的拆分开来。
还是以上面的例子进行演示:

  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
    
  3. 在主配置文件中包含新创建的配置文件:

    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的配置文件相关知识点就介绍到这儿了,如果有错误或遗漏的地方欢迎在评论区指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值