SpringBoot入门学习笔记五(配置文件与@PropertySource注解)

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/103119751








一、Spring Boot 配置文件

Spring Boot 配置文件 是用来规定项目要履行哪些约定的一种文件,如设置项目的端口号、更改路径地址等。Spring Boot 也有自己默认的一套配置,我们可以通过 Spring Boot 配置文件 进行修改默认的配置。

Spring Boot 中,它默认只识别两个配置文件(文件名字是固定的):application.propertiesapplication.yml 。properties 格式的配置文件是 Java 独有的, yml 格式的配置文件另外一种格式的配置文件它更在乎可读性还支持中文。总的来说使用哪种配置文件都是可以的,但文件名必须是 application,这两种配置文件可以互补,也可以结合使用。

1、application.properties配置文件

properties配置文件 是我们 Java 所特有的配置文件。我以前写过一篇专门讲解 properties配置文件 的博客,感兴趣的可以了解:JAVA之 properties文件

使用格式: k=v

application.properties文件


2、application.yml配置文件

yml配置文件,它的全称是:YAML Aint Markup Language(YAML 不是一种标记语言)。在开发的这种语言时, YAML 的意思其实是:“Yet Another Markup Language”,它仍是一种标记语言,但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

相信大家对标记语言有过一些了解,我们常用的 HTML、XML 这些都属于 标记语言。

以 XML 为例,它是这样定义的:

<server>
    <port>8882</port>
    <path>/a/b/c</path>
</server>

如果换成 YAML,就应该这样写:

server:
	port: 8882
	path: /a/b/c

1)语法样式

  1. 多行写法( k: v ) 或 行内写法( k: v, k: [Set/List/数组], k: {Map键: map值v}

    注意: 冒号后面必须有空格;

  2. 要有缩进指定层次关系;

  3. 默认可以不写引号,双引号会将其中的转义符进行转义,其他不会;

  4. # 后表示注释

2)示例

先写两个类,再写几个配置文件。

  • Student类 和 Pet类

    @Component    // 将此Java类放到Spring容器中
    @ConfigurationProperties(prefix="student")
    public class Student {
        private String name; // 姓名
        private int age; // 年龄
        private boolean sex; // 性别(true:男, false:女)
        private Date birthday; // 生日
        // {province:山西, city:太原, zone:小店区}
        private Map<String, Object> location; // 住址
        private String[] hobbies; // 爱好
        private List<String> skills; // 技能
        private Pet pet; // 宠物
        // get...&set...
    }
    
    class Pet {
        private String nickName; // 昵称
        private String strain; // 种类
        // get...&set...
    }
    
  • application.properties文件

    properties文件 不支持中文,所以以 Unicode 编码的形式显示。

    server.port=8882
    student.name=ls
    student.age=24
    student.sex=true
    student.birthday=2019/01/01
    student.location.province=\u5C71\u897F
    student.location.city=\u592A\u539F
    student.location.zone=\u5C0F\u5E97\u533A
    student.hobbies=\u7BEE\u7403, \u8DB3\u7403
    student.skills=\u7F16\u7A0B, \u91D1\u878D
    student.pet.nickName=wc
    student.pet.strain=hsq
    
  • application.yml文件 (多行写法)

    student:
    	name: zs
    	age: 23
    	sex: true
    	birthday: 2019/01/01
    	
    	location: 
    		province: "山\n西"
    		city: '太\n原'
    		zone: 小\n店区
    	# 双引号可以解析转义字符,单引号和不加引号会原样输出
    	# 行内写法:
    	# location: {province: "山\n西", city: '太\n原', zone: 小\n店区}
    	
    	hobbies:
    		- 篮球
    		- 足球
    	# 行内写法:
    	# hobbies: [篮球, 足球]
    	
    	skills:
    		- 编程
    		- 金融
    	# 行内写法:
    	# skills: [编程, 金融]
    	
    	pet: 
    		nickName: wc
    		strain: hsq
    
  • application.yml (行内写法)

    行内写法的可读性较差,建议使用多行写法。

    student: {name: zs, age: 23, sex: true, birthday: 2019/01/01, location: {province: 山西, city: 太原, zone: 小店区}, hobbies: [篮球, 足球], skills: [编程, 金融], pet: {nickName: wc, strain: hsq}}
    


二、通过 yaml 给对象注入值

1、注入值

student:
	name: zs
	age: 23

2、绑定(第一种方式:通过@ConfigurationProperties注解)

@Component   // 将此 POJO 放入到 Spring容器 中
@ConfigurationProperties(prefix="student")   // 配置属性,在配置文件中使用 student 前缀就可以注入值了
public class Student {
    ...
}

3、绑定(第二种方式:通过@Value注解)

@Component
public class Student {
    @Value("ww")
    private String name; 
    @Value("33")
    private int age;
    ...
} 

4、优先级

@ConfigurationProperties注解@Value注解 的优先级高。


5、@ConfigurationProperties注解 与 @Value注解 的区别

1)注入值

@ConfigurationProperties注解 (可以批量注入)、 @Value注解 (只能单个注入)

2)松散语法

@ConfigurationProperties注解 (支持)、 @Value注解 (不支持)

松散写法: 比如属性中 userName,在配置文件中可以写成 user-name,它们可以互相代替)

3)SPEL 表达式

@ConfigurationProperties注解 (不支持)、 @Value注解 (支持)

注意: 这里只是说在 @ConfigurationProperties注解 中不支持 SPEL表达式,但在 配置文件 中是支持 SPEL表达式的。

  • application.yml
student:
    uname: zs
    ...
  • Student.java
@Component
public class Student {
	@Value("${student.uname}")   // 可以将配置文件中的 uname 的值注入到该属性中
	private String userName;
}

4)JSR303 数据校验:

@ConfigurationProperties注解 (支持)、 @Value注解 (不支持)

首先在实体类中开启 jsr303 校验数据的注解,再在需要校验数据的属性上加上校验的注解。

  • Student.java
@Component // 将此 Java类 放到 Spring 容器中
@ConfigurationProperties(prefix="student")
@Validated   // 开启 jsr303 校验数据
public class Student {
    @Email
    private String email;
    ...
}
  • application.yml
student:
	email: [email protected]

注: 能够校验出配置文件中注入的这个邮箱是否合法。

5)注入复杂类型:

@ConfigurationProperties注解 (支持简单类型和复杂类型)、 @Value注解 (只支持简单类型,不支持复杂类型)

注: Spring Boot 中的简单类型(8个基本类型 / String / Date)。


通过上述的区别,更推荐大家使用 @ConfigurationProperties注解



三、@PropertySource注解

此注解默认会加载 application.properties文件application.yml文件 中的数据,也可以指定加载的文件,不过指定加载文件的优先级没有 application文件 的优先级高。

注意:properties配置文件 的优先级高于 yml配置文件

// 加载 tea.properties文件 和 tea.yml文件
@PropertySource(value = {"classpath:tea.properties","classpath:tea.yml"})
public class Teacher {
	...
}


博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



发布了166 篇原创文章 · 获赞 169 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/sun8112133/article/details/103119751