springboot —— 配置文件注入
一、配置文件
-
配置文件
springboot 使用一个 全局配置文件 (配置文件的名称是固定的application)-
application.properties (默认的配置文件)
或者 -
application.yml (yml语法简洁,推荐)
-
注意:
properties 和 yml 文件同时存在时,会默认加载 application.properties
-
-
配置文件的作用:
修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好
- 配置文件的细节:
- application.properties
# 支持(spEL表达式)和 字面量(数字,字符串,布尔)
server.port=8081
user.userName=李四
user.pwd=1234567896
user.mobile=1889394848223
user.age=289
user.hobbyList=吃饭,睡觉,打豆豆
user.map.k1=123456
user.map.k2=456789
- application.yml
# 仅支持字面量(数字,字符串,布尔)
server:
port: 8081
user:
user-name: 李四
pwd: 1234567896
mobile: 18369615874
age: 289
hobby-list: [吃饭,睡觉,打豆豆]
map: {k1: 123456,k2: 456789}
- 【jar包依赖】导入配置文件处理器,配置文件进行绑定就会有提示,配合热启动更好用
<!-- 配置文件处理器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐configuration‐processor</artifactId>
<optional>true</optional>
</dependency>
<!--热启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
二、将配置文件中指定属性的值,映射到指定的组件中
利用 以下 几个 注解 实现:
@ConfigurationProperties 注解
@Value 注解
@PropertySource 注解
@Value 和 @ConfigurationProperties的区别:
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
名词解释:
松散绑定(松散语法):以userName为例,松散绑定是指userName、user-name和user_name是等价的,可是识别
SpEL:Spring官方的EL表达式
JSR303参数校验:是指在注入之前进行参数的格式校验(@Email;@Phone等)
复杂类型的封装:支持数组、map和对象
Spring Expression Language 官方文档
JSR303参数校验
1. @ConfigurationProperties 注解
- 作用:
通知SpringBoot,将本类中的所有属性和配置文件中相关的配置属性进行绑定
- 属性:
prefix=“user”:配置文件中user下面的所有属性和javaBean进行一一映射
-
注意:
- 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能
- @ConfigurationProperties默认从全局配置文件中获取值
-
用法:
Bean
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private String userName;
private String mobile;
private String pwd;
private int age;
private String[] hobbyList;
private Map<String,String> map;
}
2.@Value 注解
- 作用:
将配制文件中的某个属性和Bean中的值进行绑定注入,也可以使用spEL给Bean属性赋值
-
注意:
- @Value默认从全局配置文件中获取值
- 只有这个组件是容器中的组件,容器才能提供的@Value功能
- 不支持复杂类型的封装,如果有复杂类型就会原样输出
- 如果是多对键值对的map会直接报错
- 直接给bean注入字面量属性,数组只能注入一个值,不支持map和对象
-
用法:
使用SpEL表达式实现注入
@Component
@ConfigurationProperties(prefix = "user")
public class User {
//1、SpEL字面量(数字,字符串(字符串要带单引号),布尔值)
@Value("#{'张三'}")
private String userName;
@Value("#{'18396547866'}")
private String mobile;
//2、调用java方法
@Value("#{new String(new java.util.Random().nextInt(10000000))}")
private String pwd;
@Value("#{new java.util.Random().nextInt(110)}")
private int age;
//3、数组
@Value("#{{'吃饭','睡觉','打豆豆'}}")
private String[] hobby;
//4、map和object
@Value("#{{'k1':'victory','k2':'haha'}}")
private Map<String,String> map;
}
//结果打印
2020-07-07 11:18:11.290 INFO 8856 --- [main] com.example.demo.DemoApplicationTests : Started DemoApplicationTests in 4.371 seconds (JVM running for 5.547)
User(userName=张三, mobile=18396547866, pwd=1561715, age=45, hobbyList=[吃饭, 睡觉, 打豆豆], map={k1=victory, k2=haha})
吃饭
睡觉
打豆豆
2020-07-07 11:18:11.571 INFO 8856 --- [Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
配置文件的某个属性的值 对 Bean 中的属性,进行绑定注入
@Component
@ConfigurationProperties(prefix = "user")
public class User {
@Value("${user.userName}")
private String userName;
@Value("${user.mobile}")
private String mobile;
@Value("${user.pwd}")
private String pwd;
@Value("${user.age}")
private int age;
@Value("${user.hobbyList}")
private String[] hobby;
@Value("${user.map}")
private Map<String,String> map;
}
//打印结果
2020-07-07 10:16:30.211 INFO 29088 --- [main] com.example.demo.DemoApplicationTests : Started DemoApplicationTests in 3.013 seconds (JVM running for 3.856)
User(userName=张三, mobile=18369615874, pwd=123456, age=26, hobbyList=[${user.hobby}], map=null)
${user.hobbyList}
2020-07-07 10:16:30.405 INFO 29088 --- [Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
直接给bean注入字面量属性,数组只能注入一个值,不支持map和对象
@Component
@ConfigurationProperties(prefix = "user")
public class User {
@Value("李四")
private String userName;
@Value("18697563215")
private String mobile;
@Value("123456")
private String pwd;
@Value("25")
private int age;
@Value("吃饭")
private String[] hobby;
@Value("k1:12456")
private Map<String,String> map;
}
- @PropertySource 注解
- 作用
通知spring容器加载指定的一个或多个配置文件
- 注意:
-
- 主配置文件和指定配置文件都有相应的配置属性以主配置文件的属性内容为准
-
- 多个配置文件中都存在同一属性以第一个配置文件为准
-
- 多个配置文件才凑成整个bean的属性时,配置内容互补
-
- 只能读取.properties文件
.yml 文件 的读取 需要自己定义
- 用法
配合@ConfigurationProperties使用
@Component
@PropertySource(value = {"classpath:user.properties"})
@ConfigurationProperties(prefix = "user")
public class User {
private String userName;
private String mobile;
private String pwd;
private int age;
private String[] hobbyList;
private Map<String,String> map;
}
//打印结果
2020-07-07 15:50:52.969 INFO 36388 --- [main] com.example.demo.DemoApplicationTests : Started DemoApplicationTests in 4.356 seconds (JVM running for 5.111)
User(userName=张三, mobile=188939484826, pwd=123456789, age=28, hobbyList=[吃饭, 睡觉, 打豆豆], map={k1=123456, k2=456789})
吃饭
睡觉
打豆豆
配合@Value使用
@Component
@PropertySource(value = {"classpath:user.properties","classpath:user1.properties"})
@ConfigurationProperties(prefix = "user")
public class User {
@Value("${user.user-name}")
private String userName;
@Value("${user.mobile}")
private String mobile;
@Value("${user.pwd}")
private String pwd;
@Value("${user.age}")
private int age;
// 不支持
private String[] hobbyList;
// 不支持
private Map<String,String> map;
}
//打印结果
2020-07-07 15:54:56.870 INFO 35940 --- [main] com.example.demo.DemoApplicationTests : Started DemoApplicationTests in 4.548 seconds (JVM running for 5.963)
User(userName=张三, mobile=188939484826, pwd=123456789, age=28, hobbyList=null, map=null)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69782.html