迅速学会@ConfigurationProperties的使用操作

目录
  • @ConfigurationProperties的使用
    • @ConfigurationProperties
      • Spring配置方式
  • 注解@ConfigurationProperties使用方法
    • @ConfigurationProperties
    • 作用于方法
    • 作用于Class类及其用法
    • 总结

@ConfigurationProperties的使用

@ConfigurationProperties标签可以把.yml文件里的配置读取到类里

比如,我需要把钉钉小程序的app-key和app-secret放在application.yml文件里面,方便我的配置,那么我们就这样在application.yml里编写:

dingding:
  app-key: "dings9oi56464654gfqrfms"
  app-secret: "58786163213546161231321231321aAhbCa8Vw2EVBJiw9_96vd"

现在我们新建一个类,使用注解

@ConfigurationProperties

来获得这些值:

@Setter
@Getter
@ConfigurationProperties(prefix = "dingding")
public class AppInfoConfigProperties {
    private String APP_KEY;
    private String APP_SECRET;
}

注意,被 @ConfigurationProperties 修饰的类必须带有set方法,否则无法获得配置值。

这样一来,AppInfoConfigProperties就可以拿到application.yml里的配置,这里的匹配是宽松匹配,写成

private String appKey;
private String appSecret;

也是可以获取到值的。

在经过以上的步骤后,AppInfoConfigProperties本身并没有加入容器,也就拿不到他的值,下一步我们把它注册成一个Bean:

@EnableConfigurationProperties(AppInfoConfigProperties.class)
@Configuration
public class AppInfoConfig {
    @Autowired
    AppInfoConfigProperties appInfoConfigProperties;
    @Bean("appInfoUtil")
    public AppInfoUtil appInfoUtil(){
        return new AppInfoUtil(appInfoConfigProperties.getAPP_KEY(),appInfoConfigProperties.getAPP_SECRET());
    }
}

这里我们使用了 @EnableConfigurationProperties(AppInfoConfigProperties.class) 来将 AppInfoConfigProperties给注册到了容器里,同时通过 @Autowired拿到了它的值。

至此,application.yml文件中的值已被成功获取到了容器里。

以下是AppInfoUtil 的结构:

@Getter
@Setter
@AllArgsConstructor
public class AppInfoUtil {
    private String appKey;
    private String appSecret;
    @Override
    public String toString() {
        return String.format("本小程序的APP-KEY:[%s];本小程序的APP-SECRET:[%s]",this.getAppKey(),this.getAppSecret());
    }
}

为什么不直接使用AppInfoConfigProperties?

原因是因为AppInfoUtil可能会根据业务的需要做出很多的增强功能,所以与配置分离。

注解@ConfigurationProperties使用方法

最近在思考使用java config的方式进行配置,java config是指基于java配置的spring。传统的Spring一般都是基本xml配置的,后来spring3.0新增了许多java config的注解,特别是spring boot,基本都是清一色的java config。

Spring配置方式

第一阶段:xml配置

在spring 1.x时代,使用spring开发满眼都是xml配置的bean,随着项目的扩大,

我们需要把xml配置文件分放到不同的配置文件中,那时候需要频繁地在开发的类和配置文件间切换。

第二阶段:注解配置

在spring 2.x时代,随着JDK1.5带来的注解支持,spring提供了声明bean的注解,大大减少了配置量。这时spring圈子存在一种争论:注解配置和xml配置究竟哪个更好?我们最终的选择是应用的基本配置用xml,业务配置用户注解。

第三阶段:Java配置(java config)

从spring 3.x到现在,spring提供了Java配置的能力,使用Java配置更好的理解

配置的bean。spring 4.x和spring boot都推荐使用Java配置。

Spring IOC有一个非常核心的概念——Bean。由Spring容器来负责对Bean的实例化,装配和管理。XML是用来描述Bean最为流行的配置方式。但随着Spring的日益发展,越来越多的人对Spring提出了批评。“Spring项目大量的烂用XML”就是最为严励的一个批评。由于Spring会把几乎所有的业务类都以Bean的形式配置在XML文件中,造成了大量的XML文件。使用XML来配置Bean失去了编译时的类型安全检查。大量的XML配置使得整个项目变得更加复杂。

随着JAVA EE 5.0的发布,其中引入了一个非常重要的特性——Annotations(注释)。注释是源代码的标签,这些标签可以在源代码层进行处理或通过编译器把它熔入到class文件中。在JAVA EE5以后的版本中,注释成为了一个主要的配置选项。Spring使用注释来描述Bean的配置与采用XML相比,因类注释是在一个类源代码中,可以获得类型安全检查的好处。可以良好的支持重构。

JavaConfig就是使用注释来描述Bean配置的组件。JavaConfig 是Spring的一个子项目, 比起Spring,它还是一个非常年青的项目。目前的版本是1.0 M2。使用XML来配置Bean所能实现的功能,通过JavaConfig同样可以很好的实现。

下面具体讲一讲@ConfigurationProperties使用方法

@ConfigurationProperties

Spring源码中大量使用了ConfigurationProperties注解,比如server.port就是由该注解获取到的,通过与其他注解配合使用,能够实现Bean的按需配置。

该注解有一个prefix属性,通过指定的前缀,绑定配置文件中的配置,该注解可以放在类上,也可以放在方法上

可以从注解说明中看到,当将该注解作用于方法上时,如果想要有效的绑定配置,那么该方法需要有@Bean注解且所属Class需要有@Configuration注解。

简单一句话概括就是:Sring的有效运行是通过上下文(Bean容器)中Bean的配合完成的,Bean可以简单理解成对象,有些对象需要指定字段内容,那么这些内容我们可以通过配置文件进行绑定,然后将此Bean归还给容器

作用于方法

比较常见的就是配置读写分离的场景。

配置文件内容

#数据源
spring.datasource.druid.write.url=jdbc:mysql://localhost:3306/jpa
spring.datasource.druid.write.username=root
spring.datasource.druid.write.password=1
spring.datasource.druid.write.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.read.url=jdbc:mysql://localhost:3306/jpa
spring.datasource.druid.read.username=root
spring.datasource.druid.read.password=1
spring.datasource.druid.read.driver-class-name=com.mysql.jdbc.Driver

java代码

@Configuration
public class DruidDataSourceConfig {
    /**
     * DataSource 配置
     * @return
     */
    @ConfigurationProperties(prefix = "spring.datasource.druid.read")
    @Bean(name = "readDruidDataSource")
    public DataSource readDruidDataSource() {
        return new DruidDataSource();
    }
    /**
     * DataSource 配置
     * @return
     */
    @ConfigurationProperties(prefix = "spring.datasource.druid.write")
    @Bean(name = "writeDruidDataSource")
    @Primary
    public DataSource writeDruidDataSource() {
        return new DruidDataSource();
    }
}

也许有的人看到这里会比较疑惑,prefix并没有指定配置的全限定名,那它是怎么进行配置绑定的呢?

相信大家肯定了解@Value注解,它可以通过全限定名进行配置的绑定,这里的ConfigurationProperties其实就类似于使用多个@Value同时绑定,绑定的对象就是DataSource类型的对象,而且是 隐式绑定 的,意味着在配置文件编写的时候需要与对应类的字段名称 相同,比如上述spring.datasource.druid.write.url=jdbc:mysql://localhost:3306/jpa ,当然了,你也可以随便写个配置,比如 spring.datasource.druid.write.uuu=www.baidu.com,此时你只需要在注解中加上以下参数即可

以上就完成了多个数据源的配置,为读写分离做了铺垫

作用于Class类及其用法

配置文件内容

spring.datasource.url=jdbc:mysql://127.0.0.1:8888/test?useUnicode=false&autoReconnect=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

java代码

@ConfigurationProperties(prefix = "spring.datasource")
@Component
public class DatasourcePro {
    private String url;
    private String username;
    private String password;
    // 配置文件中是driver-class-name, 转驼峰命名便可以绑定成
    private String driverClassName;
    private String type;
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getDriverClassName() {
        return driverClassName;
    }
    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
}

用法

@Controller
@RequestMapping(value = "/config")
public class ConfigurationPropertiesController {
    @Autowired
    private DatasourcePro datasourcePro;
    @RequestMapping("/test")
    @ResponseBody
    public Map<String, Object> test(){
        Map<String, Object> map = new HashMap<>();
        map.put("url", datasourcePro.getUrl());
        map.put("userName", datasourcePro.getUsername());
        map.put("password", datasourcePro.getPassword());
        map.put("className", datasourcePro.getDriverClassName());
        map.put("type", datasourcePro.getType());
        return map;
    }
}

总结

@ConfigurationProperties 和 @value 有着相同的功能,但是 @ConfigurationProperties的写法更为方便

@ConfigurationProperties 的 POJO类的命名比较严格,因为它必须和prefix的后缀名要一致, 不然值会绑定不上, 特殊的后缀名是“driver-class-name”这种带横杠的情况,在POJO里面的命名规则是 下划线转驼峰 就可以绑定成功,所以就是 “driverClassName”

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot中注解@ConfigurationProperties与@Value的区别与使用详解

    目录 注解@ConfigurationProperties 注解@Value 区别 松散语法绑定: SpEl语法表示: JSR303数据校验: 复杂类型封装: 配置文件注入值数据校验 注解@ConfigurationProperties 该注解的作用是将配置文件中配置的每一个属性的值,映射到这个组件中.@ConfigurationProperties :告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定 prefix = "person":配置文件中哪个下面的所有

  • @ConfigurationProperties遇到的坑及解决

    想着偷懒,直接使用@ConfigurationProperties(prefix="xxx")读取配置文件,不使用@Value("${xxx}")去一个一个的注入. 遇到的坑: 创建完成类以后忘记生成set方法,导致启动项目无法读取配置文件:使用@Value("${xxx}")在没有生成set方法前提下,能注入配置参数. 注: 1.如果使用@ConfigurationProperties注入配置参数,切记生成get和set方法. 2.使用@Val

  • Java中@ConfigurationProperties实现自定义配置绑定问题分析

    目录 @ConfigurationProperties使用 @ConfigurationProperties特点 宽松绑定 支持复杂属性类型 激活@ConfigurationProperties 通过@EnableConfigurationProperties 通过@ConfigurationPropertiesScan @ConfigurationProperties与@Value对比 使用 Spring Boot Configuration Processor 完成自动补全 @Configu

  • springboot如何使用@ConfigurationProperties封装配置文件

    使用@ConfigurationProperties封装配置文件 业务场景: 把配置文件的信息,读取并自动封装成实体类,可以使用@ConfigurationProperties,把同类的配置信息自动封装成实体类. 1.在pom.xml中添加依赖包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor<

  • 聊聊@value注解和@ConfigurationProperties注解的使用

    目录 @value注解和@ConfigurationProperties注解 @value读取默认配置 @ConfigurationProperties读取默认配置 @ConfigurationProperties和@Value使用上的一点区别 第一段代码 第二段代码 @value注解和@ConfigurationProperties注解 @value读取默认配置 yml文件内容如下(装了STS插件以后即可直接使用,改后缀就行了) user: username: xiongda sex: man

  • 迅速学会@ConfigurationProperties的使用操作

    目录 @ConfigurationProperties的使用 @ConfigurationProperties Spring配置方式 注解@ConfigurationProperties使用方法 @ConfigurationProperties 作用于方法 作用于Class类及其用法 总结 @ConfigurationProperties的使用 @ConfigurationProperties标签可以把.yml文件里的配置读取到类里 比如,我需要把钉钉小程序的app-key和app-secret

  • OpenCV半小时掌握基本操作之图像基础操作

    目录 概述 截取图像 获取颜色通道 读取视频 [OpenCV]⚠️高手勿入! 半小时学会基本操作⚠️ 图像基础操作 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. 截取图像 例子: # 截取图像 img = cv2.imread("picture.jpg") img = img[200:600, 400:1000] cv2.imshow("cut", img) cv2.waitKey(

  • SQL2008 详解直接将XML存入到SQL中

    一.前言 从 SQL Server 2005 开始,就增加了 xml 字段类型,也就是说可以直接把 xml 内容存储在该字段中,并且 SQL Server 会把它当作 xml 来对待,而不是当作 varchar 来对待. 随着SQL Server 对XML字段的支持,相应的,T-SQL语句也提供了大量对XML操作的功能来配合SQL Server中XML字段的使用.本文主要说明如何使用SQL语句对XML进行操作. 二.定义XML字段 在进行数据库的设计中,我们可以在表设计器中,很方便的将一个字段定

  • ASP连接11种数据库语法总结

    经常使用到有关数据库的操作.包括连接代码.SQL命令等等,又不曾刻意去记忆它们(我本人是不愿意去记这东东),所以常常在用到的时候又去查书本,翻来翻去.一些比较少用的数据库还不一定能顺利找到,所以现在把它们全归纳到这里,提供大家参考.<一>数据库的连接方法: 1.Access数据库的DSN-less连接方法: set adocon=Server.Createobject("adodb.connection") adoconn.Open"Driver={Microso

  • 微信公众平台开发教程①获取用户Openid及个人信息图文详解

    本文实例讲述了微信公众平台开发获取用户Openid及个人信息.分享给大家供大家参考,具体如下: 前言: 初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客.问答,对于参差不齐的信息,自己也是有苦说不出,抽出一点时间写点文章,既是对自己的学习总结,也希望给予同是菜鸟的学渣一点帮助 背景介绍: 我需要用户接收微信分享的链接后,点击进入给参加活动的用户[点赞],然后需要后台获取该微信用户的 openid 作为唯一的标记信息,以便保证该用户下次进入后进行数据库的比对,直接提取其对应的操作信

  • C语言中结构体和共用体实例教程

    目录 一.实验目的 二.实验内容 三.实验记录 3.1 候选人选票统计 3.2 print函数 3.3 链表 总结 一.实验目的 掌握结构体类型变量的定义和使用: 掌握结构体类型数组的概念和应用: 掌握链表的概念,初步学会对链表进行操作: 掌握共用体的概念与使用: 掌握指向结构体变量的指针. 掌握指向结构体数组的指针的应用. 二.实验内容 编写下列程序,然后上机调试运行. 对候选人得票的统计程序.设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果. 编写一个函数print,

  • springboot自动配置原理以及spring.factories文件的作用详解

    目录 一.springboot 自动配置原理 二.spring.factories文件的作用 spring.factories 的妙用 什么是 SPI 机制? Spring Boot 中的 SPI 机制 Spring Factories 实现原理是什么? Spring Factories 在 Spring Boot 中的应用 一.springboot 自动配置原理 先说说我们自己的应用程序中Bean加入容器的办法: package com.ynunicom.dc.dingdingcontract

  • Appium自动化测试实现九宫格解锁

    目录 背景 高级手势 轻敲(tap) 短按 (press) 长按 (long_press) 等待 (wait) 移动到 (moveTo) 释放 (release) 执行 (perform) 九宫格解锁 背景 我们在操作APP密码解锁里面就有一个九宫格滑动解锁,这时候我们就需要手动连续滑动进行操作,前面提到的swipe.scroll.drag_and_drop 这些就无法实现解锁操作,我们就需要学会使用高级手势操作. 高级手势 高级手势TouchAction可以实现一些针对手势的操作,比如滑动.长

  • 时间轻松学会.NET Core操作ElasticSearch7的方法

    在互联网上,随处可见的搜索框.背后所用的技术大多数就是全文检索. 在全文检索领域,常见的库/组件有:Lucene.Solr.Sphinx.ElasticSearch等. 简单对比几种全文引擎的区别 Lucene是一个基于Java开发的全文检索基础包,使用起来繁杂,且默认不支持分布式检索 Solr是基于Lucene开发的一个搜索工具.抽象度更高,使用更简单,且提供一个控制面板. ElasticSearch也是基于Lucene开发的.同样是高度抽象,并提供了一个非常强大的DSL检索功能,可以很方便的

  • 学会python操作excel永不加班系列

    目录 一.第三方类库介绍 二.安转第三方类库 三.引用xlrd读取excel数据 四.引入openpyxl写入数据 总结 实验环境: 系统:win10 语言:python3.8 承载软件:pycharm2021.1.2 (Professional Edition) 第三方类库:openpyxl.xlrd 一.第三方类库介绍 xlrd库是一个很常用的读取excel文件的库,其对excel文件的读取可以实现比较精细的控制. openpyxl是实现excel的写入操作的第三方类库 二.安转第三方类库

随机推荐