java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot全局配置文件

一文带你看懂SpringBoot中的全局配置文件

作者:程序员阿红

这篇文章主要介绍了一文带你看懂SpringBoot中的全局配置文件,全局配置文件能够对一些默认配置值进行修改,Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件,需要的朋友可以参考下

全局配置文件能够对一些默认配置值进行修改。

Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件,该文件存放在src/main/resource目录或者类路径的/config,一般会选择resource目录。

接下来,将针对这两种全局配置文件进行讲解 :

Spring Boot配置文件的命名及其格式:

1.application.properties配置文件

使用Spring Initializr方式构建Spring Boot项目时,会在resource目录下自动生成一个空的application.properties文件,Spring Boot项目启动时会自动加载application.properties文件。

我们可以在application.properties文件中定义Spring Boot项目的相关属性

当然,这些相关属性可以是系统属性、环境变量、命令参数等信息,也可以是自定义配置文件名称和位置

#修改tomcat的版本号
server.port=8888
#定义数据库的连接信息 JdbcTemplate
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/lagou
spring.datasource.username=root
spring.datasource.password=wu7787879

接下来,通过一个案例对Spring Boot项目application.properties配置文件的具体使用进行讲解 演示:

预先准备了两个实体类文件,后续会演示application.properties配置文件中的自定义配置属性注入到Person实体类的对应属性中

创建实体类

先在项目的com.lagou包下创建一个pojo包,并在该包下创建两个实体类Pet和Person

public class Pet {
  private String type;
  private String name;
}
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
  private int id;       //id
  private String name;    //名称
  private List hobby;    //爱好
  private String[] family; //家庭成员
  private Map map;
  private Pet pet;      //宠物
}

@ConfigurationProperties(prefix = “person”)注解的作用是将配置文件中以person开头的属性值通过setXX()方法注入到实体类对应属性中@Component注解的作用是将当前注入属性值的Person类对象作为Bean组件放到Spring容器中,只有这样@ConfigurationProperties注解进行赋值

打开项目的resources目录

打开项目的resources目录下的application.properties配置文件,在该配置文件中编写需要对Person类设置的配置属性

#自定义配置信息
person.id=1
person.name=王二麻子
person.hobby=read,write
person.family=father,mather
person.map.key1=value1
person.map.key2=value2
person.pet.type=dog
person.pet.name=哈士奇

查看application.properties配置文件是否正确

同时查看属性配置效果,打开通过IDEA工具创建的项目测试类,在该测试类中引入Person实体类Bean,并进行输出测试

@RunWith(SpringRunner.class) // 测试启动器,并加载Spring Boot测试注解
@SpringBootTest  // 标记为Spring Boot单元测试类,并加载项目的ApplicationContext上下文环
境
class SpringbootDemoApplicationTests {
    // 配置测试
    @Autowired
    private Person person;
    @Test
    void configurationTest() {
      System.out.println(person);
    }
}

打印结果:

image-20220622231527752

可以看出,测试方法configurationTest()运行成功,同时正确打印出了Person实体类对象。至此,说明application.properties配置文件属性配置正确,并通过相关注解自动完成了属性注入

中文乱码问题解决

调整文件编码格式:

image-20220622231818914

设置Tomcat及Http编码

#解决中文乱码
server.tomcat.uri-encoding=UTF-8
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true

2. application.yaml配置文件

YAML文件格式是Spring Boot支持的一种JSON文件格式,相较于传统的Properties配置文件,YAML文件以数据为核心,是一种更为直观且容易被电脑识别的数据序列化格式。application.yaml配置文件的 工作原理和application.properties是一样的,只不过yaml格式配置文件看起来更简洁一些。

YAML文件的扩展名可以使用.yml或者.yaml。

application.yml文件使用 “key:(空格)value”格式配置属性,使用缩进控制层级关系。

SpringBoot的三种配置文件是可以共存的:

image-20220622231939749

这里,针对不同数据类型的属性值,介绍一下YAML

value值为普通数据类型

value值为普通数据类型(例如数字、字符串、布尔等)

当YAML配置文件中配置的属性值为普通数据类型时,可以直接配置对应的属性值,同时对于字符串类型的属性值,不需要额外添加引号,示例代码如下

server:
 port: 8080
 servlet:
 context-path: /hello

value值为数组和单列集合

当YAML配置文件中配置的属性值为数组或单列集合类型时,主要有两种书写方式:缩进式写法和行内式写法。

其中,缩进式写法还有两种表示形式,示例代码如下

person:
 hobby:
 - play
 - read
 - sleep

或者使用如下示例形式

person:
 hobby:
  play,
  read,
  sleep

上述代码中,在YAML配置文件中通过两种缩进式写法对person对象的单列集合(或数组)类型的爱好hobby赋值为play、read和sleep。其中一种形式为“-(空格)属性值”,另一种形式为多个属性值之前加英文逗号分隔(注意,最后一个属性值后不要加逗号)。

person:
hobby: [play,read,sleep]

通过上述示例对比发现,YAML配置文件的行内式写法更加简明、方便。另外,包含属性值的中括号“[]”还可以进一步省略,在进行属性赋值时,程序会自动匹配和校对

value值为Map集合和对象

当YAML配置文件中配置的属性值为Map集合或对象类型时,YAML配置文件格式同样可以分为两种书写方式:缩进式写法和行内式写法。

其中,缩进式写法的示例代码如下

person:
 map:
  k1: v1
  k2: v2

对应的行内式写法示例代码如下

person:
 map: {k1: v1,k2: v2}

在YAML配置文件中,配置的属性值为Map集合或对象类型时,缩进式写法的形式按照YAML文件格式编写即可,而行内式写法的属性值要用大括号“{}”包含。

接下来,在Properties配置文件演示案例基础上,通过配置application.yaml配置文件对Person对象进行赋值,具体使用如下

(1)在项目的resources目录下,新建一个application.yaml配置文件,在该配置文件中编写为Person类设置的配置属性

#对实体类对象Person进行属性配置
person:
 id: 1
 name: 王二麻子
 family:
  - 妻
  - 妾
 hobby:
  - play
  - read
  - sleep
 map:
  k1: value1
  k2: value2
 pet:
  type: 狗
  name: 哈士奇

(2)再次执行测试结果

Person{
	id=1, 
	name='王二麻子', 
    hobby=[play, read, sleep], 
    family=[妻, 妾],
    map={k1=value1,k2=value2}, 
    pet=Pet{type='狗', name='哈士奇'}
}

可以看出,测试方法configurationTest()同样运行成功,并正确打印出了Person实体类对象。

需要说明的是,本次使用application.yaml配置文件进行测试时需要提前将application.properties配置文件中编写的配置注释,这是因为application.properties配置文件会覆盖application.yaml配置文件

3. 配置文件属性值的注入

配置文件的优先级如下: 从低到高

<includes>
     <include>**/application*.yml</include>
     <include>**/application*.yaml</include>
     <include>**/application*.properties</include>
 </includes

使用Spring Boot全局配置文件设置属性时:

如果配置属性是Spring Boot已有属性,例如服务端server.port,那么Spring Boot内部会自动扫描并读取这些配置文件中的属性值并覆盖默认属性。

如果配置的属性是用户自定义属性,例如刚刚自定义的Person实体类属性,还必须在程序中注入这些配置属性方可生效。

Spring Boot支持多种注入配置文件属性的方式,下面来介绍如何使用注解@ConfigurationProperties和@Value注入属性

4. 使用@ConfigurationProperties注入属性

Spring Boot提供的@ConfigurationProperties注解用来快速、方便地将配置文件中的自定义属性值批量注入到某个Bean对象的多个对应属性中。

假设现在有一个配置文件,如果使用 @ConfigurationProperties注入配置文件的属性,示例代码如下:

@Data
@Component
//将配置文件中所有以person开头的配置信息注入当前类中
//前提1:必须保证配置文件中person.xx与当前Person类的属性名一致
//前提2:必须保证当前Person中的属性都具有set方法
@ConfigurationProperties(prefix = "person")
public class Person {
  private int id;       //id
  private String name;    //名称
  private List hobby;    //爱好
  private String[] family;  //家庭成员
  private Map map;
  private Pet pet;      //宠物
}

上述代码使用@Component和@ConfigurationProperties(prefix = “person”)将配置文件中的每个属性映射到person类组件中。

5. 使用@Value注入属性

@Value注解是Spring框架提供的,用来读取配置文件中的属性值并逐个注入到Bean对象的对应属性中,Spring Boot框架从Spring框架中对@Value注解进行了默认继承,所以在Spring Boot框架中还可以 使用该注解读取和注入配置文件属性值。使用@Value注入属性的示例代码如下

@Component
public class Person {
 @Value("${person.id}")
  private int id;   
}

上述代码中,使用@Component和@Value注入Person实体类的id属性。其中,@Value不仅可以将配置文件的属性注入Person的id属性,还可以直接给id属性赋值,这点是@ConfigurationProperties不支持的

演示@Value注解读取并注入配置文件属性的使用:

创建实体类

在com.lagou.pojo包下新创建一个实体类Student,并使用@Value注解注入属性

@Component
public class Student {
   @Value("${person.id}")
   private int id;
   @Value("${person.name}")
   private String name; //名称
   //省略toString
 }

Student类使用@Value注解将配置文件的属性值读取和注入。 从上述示例代码可以看出,使用@Value注解方式需要对每一个属性注入设置,同时又免去了属性的setXX()方法

再次打开测试类进行测试

@Autowired
private Student student;
    @Test
    public void studentTest() {
    System.out.println(student);
}

打印结果:

image-20220622234033721

可以看出,测试方法studentTest()运行成功,同时正确打印出了Student实体类对象。需要说明的是,本示例中只是使用@Value注解对实例中Student对象的普通类型属性进行了赋值演示,而@Value注 解对于包含Map集合、对象以及YAML文件格式的行内式写法的配置文件的属性注入都不支持,如果赋值会出现错误.

6. 自定义配置

spring Boot免除了项目中大部分的手动配置,对于一些特定情况,我们可以通过修改全局配置文件以适应具体生产环境,可以说,几乎所有的配置都可以写在application.yml文件中,Spring Boot会自 动加载全局配置文件从而免除我们手动加载的烦恼。

但是,如果我们自定义配置文件,Spring Boot是无法识别这些配置文件的,此时就需要我们手动加载。接下来,将针对Spring Boot的自定义配置文件及其加载方式进行讲解

使用@PropertySource加载配置文件

对于这种加载自定义配置文件的需求,可以使用@PropertySource注解来实现。@PropertySource注解用于指定自定义配置文件的具体位置和名称

当然,如果需要将自定义配置文件中的属性值注入到对应类的属性中,可以使用@ConfigurationProperties或者@Value注解进行属性值注入

演示:

1、新建一个配置文件

打开Spring Boot项目的resources目录,在项目的类路径下新建一个test.properties自定义配置文件,在该配置文件中编写需要设置的配置属性

#对实体类对象MyProperties进行属性配置
test.id=110
test.name=test

2、创建一个配置类MyProperties

在com.lagou.pojo包下新创建一个配置类MyProperties,提供test.properties自定义配置文件中对应的属性,并根据@PropertySource注解的使用进行相关配置

@Component  // 自定义配置类
@PropertySource("classpath:test.properties")  // 指定自定义配置文件位置和名称
@ConfigurationProperties(prefix = "test")    // 指定配置文件注入属性前缀
public class MyProperties {
  private int id;
  private String name;
  // 省略属性getXX()和setXX()方法
  // 省略toString()方法
}

主要是一个自定义配置类,通过相关注解引入了自定义的配置文件,并完成了自定义属性值的注入。针对示例中的几个注解,具体说明如下

3、进行测试

@Autowired
 private MyProperties myProperties;
 @Test
 public void myPropertiesTest() {
  System.out.println(myProperties);
}

打印结果:

image-20220622235312834

使用@Configuration编写自定义配置类

在Spring Boot框架中,推荐使用配置类的方式向容器中添加和配置组件

在Spring Boot框架中,通常使用@Configuration注解定义一个配置类,Spring Boot会自动扫描和识别配置类,从而替换传统Spring框架中的XML配置文件。

当定义一个配置类后,还需要在类中的方法上使用@Bean注解进行组件配置,将方法的返回对象注入到Spring容器中,并且组件名称默认使用的是方法名,当然也可以使用@Bean注解的name或value属性自定义组件的名称

演示:

1、新建一个普通类

在项目下新建一个com.lagou.config包,并在该包下新创建一个类MyService,该类中不需要编写任何代码

public class MyService {
}

创建了一个空的MyService类,而该类目前没有添加任何配置和注解,因此还无法正常被Spring Boot扫描和识别

2、新建配置类

在项目的com.lagou.config包下,新建一个类MyConfig,并使用@Configuration注解将该类声明一个配置类,内容如下:

@Configuration  // 定义该类是一个配置类````
public class MyConfig {
  @Bean     // 将返回值对象作为组件添加到Spring容器中,该组件id默认为方法名
  public MyService myService(){
    return new MyService();
 }
}

MyConfig是@Configuration注解声明的配置类(类似于声明了一个XML配置文件),该配置类会被Spring Boot自动扫描识别;使用@Bean注解的myService()方法,其返回值对象会作为组件添加到了 Spring容器中(类似于XML配置文件中的标签配置),并且该组件的id默认是方法名myService

3、测试类

@Autowired
private ApplicationContext applicationContext;
@Test
public void iocTest() {
  System.out.println(applicationContext.containsBean("myService"));
}

上述代码中,先通过@Autowired注解引入了Spring容器实例ApplicationContext,然后在测试方法iocTest()中测试查看该容器中是否包括id为myService的组件。执行测试方法iocTest() ,查看控制台输出效果,结果如下:

image-20220622235830549

从测试结果可以看出,测试方法iocTest()运行成功,显示运行结果为true,表示Spirng的IOC容器中也已经包含了id为myService的实例对象组件,说明使用自定义配置类的形式完成了向Spring容器进行组件的添加和配置

到此这篇关于一文带你看懂SpringBoot中的全局配置文件的文章就介绍到这了,更多相关SpringBoot全局配置文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文