前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot-配置文件的注入

springboot-配置文件的注入

作者头像
DataScience
发布2020-01-01 22:42:35
9060
发布2020-01-01 22:42:35
举报
文章被收录于专栏:A2DataA2Data

本文标识 : Jsbt0007

本文编辑 : Jack 风

编程工具 : IDEA

阅读时长 : 5分钟


title: springboot-08配置文件的注入


::: tip 配置文件值的注入

单值注入和批量注入

:::

1、单值注入

使用@Value注解注入单个属性的值

  • yml配置文件
代码语言:javascript
复制
person:
  name: "zhangsan \n  lisi"
  age: 23
  boss: true
  birth: 2019/11/21
  • java代码
代码语言:javascript
复制
//datasource.properties 数据源的配置文件
//<bean ..> <property name="url" value="${url}"></property> </bean>

@Value("${person.name}")
private String name;

${key} :来引用属性文件中key对应的值

2、批量注入

使用@ConfigurationProperties注解批量注入配置文件中的多个值

配置文件

代码语言:javascript
复制
person:
  lastName: 年少风
  age: 18
  boss: false
  birth: 2019/11/20
  maps: {k1: v1, k2: 12}
  lists:
  - 张三
  - 李四
  dog:
    name: 哈士奇
    age: 2

@Data是一个lomlok插件,免去了getter/setter和toString这些繁琐的东西

在POM文件的节点中间添加

代码语言:javascript
复制
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.4</version>
  <scope>provided</scope>
</dependency>
代码语言:javascript
复制
//封装配置文件中person中的数据
@ConfigurationProperties(prefix = "person")
@Component
@Data
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<String> lists;
    private Dog dog;
}

使用@ConfigurationProperties注解必须同时添加@Component讲当前的配置类放入IOC容器中

代码语言:javascript
复制
@Data
public class Dog {
    private String name;
    private Integer age;
}
  • 测试代码
代码语言:javascript
复制
@RestController
public class HelloController {

    Logger log = LoggerFactory.getLogger(HelloController.class);

    @Autowired
    private Person person;

    @GetMapping("/hello")
    public String hello(){
        log.info(person.toString());
        return "hello SpringBoot-swagger";
    }
}
  • 控制台的输出
代码语言:javascript
复制
Person(lastName=年少风, age=18, boss=false, birth=Tue Nov 12 00:00:00 CST 2019, maps={k1=v1, k2=12}, lists=[张三, 李四], dog=Dog(name=哈士奇, age=2))

javaBean:

  • 将配置文件中配置的每一个属性的值,映射到这个组件中
  • @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
  • prefix = "person":配置文件中哪个下面的所有属性进行一一映射
  • 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
  • @Data是一个插件,,免去了getter/setter和toString这些繁琐的东西

如果在编写yml文件的时候没有出现属性提示:

我们可以导入配置文件处理器,以后编写配置就有提示了

代码语言:javascript
复制
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

3、两种注入的区别

@Value获取值和@ConfigurationProperties获取值的区别

@ConfigurationProperties

@Value

功能

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

不支持

SpEL:##{}

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

松散语法绑定:last_name = last-name = lastName 他们取的值都是相同的

配置文件yml还是properties他们都能获取到值;

总结:

  • 如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
  • 如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

4、注入值的数据校验

代码语言:javascript
复制
@ConfigurationProperties(prefix = "person")
@Component
@Data
@Validated //数据校验
public class Person {

    @Email(message = "用户名必须是一个正确的邮箱格式")
    private String lastName;
    @Max(value = 200,message = "年龄不能超过200岁")
    @Min(value = 0,message = "年龄必须大于0岁")
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<String> lists;
    private Dog dog;

}

经过刚才的测试得出,两个注解不能同时作用在一个属性上。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-21,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 DataScience 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、单值注入
  • 2、批量注入
  • 3、两种注入的区别
  • 4、注入值的数据校验
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com