当前位置:   article > 正文

java之学习记录 9 - 1 - SpringBoot全局配置文件、自定义配置文件_java 配置文件中的一些字段经常用是设置成全局的还是

java 配置文件中的一些字段经常用是设置成全局的还是

全局配置文件能够对一些默认配置值进行修改。Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件,该文件存放在src/main/resource目录或者类路径的/config,一般会选择resource目录。接下来,将针对这两种全局配置文件进行讲解 :

Spring Boot配置文件的命名及其格式:
  • application.properties
  • application.yaml
  • application.yml

1 application.properties配置文件

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

我们可以在application.properties文件中定义Spring Boot项目的相关属性,当然,这些相关属性可以是系统属性、环境变量、命令参数等信息,也可以是自定义配置文件名称和位置

  1. # 修改tomcat的版本号
  2. server.port=8888
  3. # 定义数据库的连接信息 JdbcTemplate
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. spring.datasource.url=jdbc:mysql://localhost:3306/lagou_edu
  6. spring.datasource.username=root
  7. spring.datasource.password=123456
接下来,通过一个案例对 Spring Boot 项目中 application.properties 配置文件的具体使用进行讲解
 
演示:
 
预先准备了两个实体类文件,后续会演示将 application.properties 配置文件中的自定义配置属性注入到Person实体类的对应属性中
 
1 )先在项目的 com.lagou 包下创建一个 pojo 包,并在该包下创建两个实体类 Pet Person
  1. public class Pet {
  2. private String type; // 品种
  3. private String name; // 名称
  4. // set get
  5. }
  1. @Component
  2. // 将配置文件中所有以person开头的配置信息注入当前类中
  3. // 前提1:必须保证配置文件中person.xx与当前Person类中的属性名一致
  4. // 前提2:必须保证当前Person中的属性都具有set方法
  5. @ConfigurationProperties(prefix = "person")
  6. public class Person {
  7. private int id; //id
  8. private String name; //名称
  9. private List hobby; //爱好
  10. private String[] family; //家庭成员
  11. private Map map;
  12. private Pet pet; //宠物
  13. // set get
  14. }
  • @ConfigurationProperties(prefix = "person")注解的作用是将配置文件中以person开头的属性值通过setXX()方法注入到实体类对应属性中
  • @Component注解的作用是将当前注入属性值的Person类对象作为Bean组件放到Spring容器中,只有这样才能被@ConfigurationProperties注解进行赋值
2 )打开项目的 resources 目录下的 application.properties 配置文件,在该配置文件中编写需要对Person类设置的配置属性
  1. # 自定义配置信息注入到Person对象中
  2. person.id=100
  3. person.name=张三
  4. # list
  5. person.body=打人,打架,粗狂
  6. # String
  7. person.family=妻,妾
  8. # map
  9. person.map.k1=v1
  10. person.map.k2=v2
  11. # pet对象
  12. person.pet.type=dog
  13. person.pet.name=小王
3 )查看 application.properties 配置文件是否正确,同时查看属性配置效果,打开通过 IDEA 工具创建的项目测试类,在该测试类中引入Person 实体类 Bean ,并进行输出测试
  1. @RunWith(SpringRunner.class) // @RunWith:运行器 SpringJUnit4ClassRunner.class:Spring运行环境 junit:junit测试环境
  2. @SpringBootTest // 标记当前类为SpringBoot测试类,加载项目的ApplicationContext上下文环境
  3. class Springbootdemo2ApplicationTests {
  4. @Autowired
  5. private Person person;
  6. @Test
  7. void showPersonInfo(){
  8. System.out.println(person);
  9. }
  10. }

打印结果:

Person{id=100, name='张三', hobby=[抽烟, 喝酒, 烫头], family=[妻, 妾], map={k1=v1, k2=v2}, pet=com.lagou.pojo.Pet@7e49ded}
可以看出,测试方法 configurationTest() 运行成功,同时正确打印出了 Person 实体类对象。至此,说明application.properties配置文件属性配置正确,并通过相关注解自动完成了属性注入
 
4 )中文乱码问题解决
 
调整文件编码格式:

设置 Tomcat Http编码(application.properties配置文件)
  1. #解决中文乱码
  2. server.tomcat.uri-encoding=UTF-8
  3. spring.http.encoding.force=true
  4. spring.http.encoding.charset=UTF-8
  5. 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的三种配置文件是可以共存的:

这里,针对不同数据类型的属性值,介绍一下 YAML
 
1 value 值为普通数据类型(例如数字、字符串、布尔等)
 

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

  1. server:
  2. port: 8080
  3. servlet:
  4. context-path: /hello
2 value 值为数组和单列集合 
 
YAML 配置文件中配置的属性值为数组或单列集合类型时,主要有两种书写方式:缩进式写法和行内 式写法。
 
  • 其中,缩进式写法还有两种表示形式,示例代码如下
  1. person:
  2. hobby:
  3. - 抽烟
  4. - 喝酒
  5. - 烫头

或者使用如下示例形式

  1. person:
  2. hobby:
  3. 抽烟,
  4. 喝酒,
  5. 烫头

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

  1. person:
  2. hobby: [play,read,sleep]

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

3value值为Map集合和对象

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

  • 其中,缩进式写法的示例代码如下
  1. person:
  2. map:
  3. k1: v1
  4. k2: v2
对应的行内式写法示例代码如下
  1. person:
  2. map: {k1: v1,k2: v2}

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

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

1 )在项目的 resources 目录下,新建一个 application.yaml 配置文件,在该配置文件中编写为 Person类设置的配置属性
  1. person:
  2. id: 1000
  3. name: 李四
  4. hobby:
  5. - 抽烟
  6. - 喝酒
  7. - 烫头
  8. family:
  9. - 郭麒麟
  10. - 小月月
  11. map:
  12. k1: 这是k1对应的value
  13. k2: 这是k2对应的value
  14. pet:
  15. type: dog
  16. name: 金毛
2 )再次执行测试
 
Person{id=1000, name='李四', hobby=[抽烟, 喝酒, 烫头], family=[郭麒麟, 小月月], map={k1=这是k1对应的value, k2=这是k2对应的value}, pet=com.lagou.pojo.Pet@563ccd31}

可以看出,测试方法configurationTest()同样运行成功,并正确打印出了Person实体类对象。需要说明的是,本次使用application.yaml配置文件进行测试时需要提前将application.properties配置文件中编写的配置注释,这是因为application.properties配置文件会覆盖application.yaml配置文件

配置文件属性值的注入

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

  1. <includes>
  2. <include>**/application*.yml</include>
  3. <include>**/application*.yaml</include>
  4. <include>**/application*.properties</include>
  5. </includes>
使用 Spring Boot 全局配置文件设置属性时:
 

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

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

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

1 使用 @ConfigurationProperties 注入属性
 

Spring Boot提供的@ConfigurationProperties注解用来快速、方便地将配置文件中的自定义属性值批量注入到某个Bean对象的多个对应属性中。假设现在有一个配置文件,如果使用@ConfigurationProperties注入配置文件的属性,示例代码如下:

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

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

2 使用 @Value 注入属性
 

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

  1. @Component
  2. public class Person {
  3. @Value("${person.id}")
  4. private int id;
  5. }

上述代码中,使用@Component@Value注入Person实体类的id属性。其中,@Value不仅可以将配置文件的属性注入Personid属性,还可以直接给id属性赋值,这点是@ConfigurationProperties不支持的,而@Value注解对于包含Map集合、对象以及YAML文件格式的行内式写法的配置文件的属性注入都不支持,如果赋值会出现错误

自定义配置

spring Boot免除了项目中大部分的手动配置,对于一些特定情况,我们可以通过修改全局配置文件以适应具体生产环境,可以说,几乎所有的配置都可以写在application.yml文件中,Spring Boot会自动加载全局配置文件从而免除我们手动加载的烦恼。但是,如果我们自定义配置文件,Spring Boot是无法识别这些配置文件的,此时就需要我们手动加载。接下来,将针对Spring Boot的自定义配置文件及其加载方式进行讲解

1 使用 @PropertySource 加载配置文件
 

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

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

演示

1 )打开 Spring Boot 项目的 resources 目录,在项目的类路径下新建一个 my.properties 自定义配置文件,在该配置文件中编写需要设置的配置属性
  1. product.id=99
  2. product.name=华为
2 )在 com.lagou.pojo 包下新创建一个配置类Product ,提供 my.properties 自定义配置文件中对应的属性,并根据@PropertySource 注解的使用进行相关配置
 
  1. @Component
  2. @PropertySource("classpath:my.properties")// 通过该注解改在外部的自定义配置文件,参数是配置文件的路径
  3. @ConfigurationProperties(prefix = "product")
  4. public class Product {
  5. private int id;
  6. private String name;
  7. // 省略属性getXX()和setXX()方法 // 省略toString()方法
  8. }

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

  • @PropertySource("classpath:my.properties")注解指定了自定义配置文件的位置和名称,此示例表示自定义配置文件为classpath类路径下的test.properties文件;
  • @ConfigurationProperties(prefix = "test")注解将上述自定义配置文件test.properties中以test头的属性值注入到该配置类属性中。
3 )进行测试
  1. @RunWith(SpringRunner.class) // @RunWith:运行器 SpringJUnit4ClassRunner.class:Spring运行环境 junit:junit测试环境
  2. @SpringBootTest // 标记当前类为SpringBoot测试类,加载项目的ApplicationContext上下文环境
  3. class Springbootdemo2ApplicationTests {
  4. @Autowired
  5. private Product product;
  6. @Test
  7. public void showProductInfo(){
  8. System.out.println(product);
  9. }
  10. }
2 使用 @Configuration 编写自定义配置类
  • Spring Boot框架中,推荐使用配置类的方式向容器中添加和配置组件
  • Spring Boot框架中,通常使用@Configuration注解定义一个配置类,Spring Boot会自动扫描和识别配置类,从而替换传统Spring框架中的XML配置文件。
  • 当定义一个配置类后,还需要在类中的方法上使用@Bean注解进行组件配置,将方法的返回对象注入到Spring容器中,并且组件名称默认使用的是方法名,当然也可以使用@Bean注解的namevalue属性自定义组件的名称

演示

1 )在项目下新建一个 com.lagou.service 包,并在该包下新创建一个类 MyService ,该类中不需要编写任何代码
  1. package com.lagou.service;
  2. public class MyService {
  3. }
创建了一个空的 MyService 类,而该类目前没有添加任何配置和注解,因此还无法正常被 Spring Boot 扫描和识别
 
2 ) 在项目的 com.lagou.config 包下,新建一个类 MyConfig ,并使用 @Configuration 注解将该类声明一个配置类,内容如下:
  1. package com.lagou.config;
  2. import com.lagou.service.MyService;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. @Configuration // 标识当前类是一个配置类,SpringBoot会扫描该类,将所有标识@Bean注解的方法返回值注入到容器中
  6. public class MyConfig {
  7. @Bean // 注入的名称就是方法的名称,注入的类型就是返回值的类型
  8. public MyService myService(){
  9. return new MyService();
  10. }
  11. }

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

3 )测试类
  1. @Autowired
  2. private ApplicationContext applicationContext;
  3. @Test
  4. public void testConfig(){
  5. System.out.println(applicationContext.containsBean("myService"));
  6. }

上述代码中,先通过@Autowired注解引入了Spring容器实例ApplicationContext,然后在测试方法 testConfig()中测试查看该容器中是否包括idmyService的组件。

执行测试方法testConfig() ,查看控制台输出效果,结果如下:

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/239496
推荐阅读
相关标签
  

闽ICP备14008679号