SpringBoot 的 配置文件 值 注入bean属性

导读:本篇文章讲解 SpringBoot 的 配置文件 值 注入bean属性,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

springboot —— 配置文件注入

一、配置文件

  1. 配置文件
    springboot 使用一个 全局配置文件 (配置文件的名称是固定的application)

    • application.properties (默认的配置文件)
      或者

    • application.yml (yml语法简洁,推荐)

    • 注意:
      properties 和 yml 文件同时存在时,会默认加载 application.properties

  2. 配置文件的作用:

修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好

  1. 配置文件的细节:
  • 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;
}
  1. @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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!