SpringBoot中@ConfigurationProperties 配置绑定

 更新时间:2021年11月15日 09:55:48   作者:yasinawolaopo  
本文主要介绍了SpringBoot中@ConfigurationProperties 配置绑定,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

SpringBoot底层的一个功能 : @ConfigurationProperties

@ConfigurationProperties 配置绑定

来举一个场景例子 :

我们习惯于把经常变化的一个东西配到配置文件里面。比如把数据库的一些链接地址、账号、密码包括数据库连接池的大小等等这些属性配到properties配置文件里面,然后为了方便 , 因为我们未来可能要创建数据库连接池,我们会把这个配置文件里面的内容又一一解析到我们数据库连接池(比如javaBean我们这个对象里面),所以我们这个实现场景就是把properties里面的所有配置绑定JavaBean里面。那我们这个绑定过程如果用java原生代码来做还是挺麻烦的大概过程:

public class getProperties {
    public static void main(String[] args){
        Properties pps = new Properties();
        pps.load(new FileInputStream("a.properties"));
        Enumeration enum1 = pps.propertyNames();//得到配置文件的名字
        while(enum1.hasMoreElements()){
            String strKey = (String) enum1.nextElement();
            String strValue = pps.getProperty(strKey);
            System.out.println(strKey + "=" + strValue);
            //封装到JavaBean。
        }
    }
}

我们使用Properties这个类我们加载来我们这个配置文件(pps.load(new FileInputStream("a.properties"));)然后遍历(while(enum1.hasMoreElements()))配置文件的每一个kv(key-value)值(String strKey = (String) enum1.nextElement(); String strValue = pps.getProperty(strKey););然后把kv值一一对应封装到JavaBean指定的属性里

其实这样还算简单的,复杂一点的就是:假设我给你个你的这个配置文件(application.properties)这个文件里面乱七八槽配置了100多行的配置,我让你在这100多行里面找数据与库有关的这四五行,那你可能会使用到正则表达式等等一大堆的东西你才能把它解析完成,但在SpringBoot里面,这个过程就会变得非常简单,我们把这个过程称为配置绑定;我们只需要一个注解@ConfigurationProperties

我在这举了个例子:

我在这写了一个Car.java的类

package com.chentianyu.boot.bean;

public class Car {
    private String brand;
    private Integer price;

    public String getBrand(){return brand;}
    public void setBrand(String brand){this.brand = brand;}

    public Integer getPrice(){return price;}
    public void setPrice(Integer price){this.price = price;}

    @Override
    public String toString(){
        return "Car{" + 
                "brand = " + brand + '\'' + 
                ", price = " + price + 
                "}";
    }
}

我们可以看做是JavaBean Car

Car有俩个属性:一个是brand(品牌),另一个是price(价格)

我现在想把跟Car有关的属性放到配置里面,我们就放springboot的application.properties这个配置文件里面。配置文件我随便写:比如我们直接写个mycar

application.properties

mycar.brand=BYD
#我的汽车的这个品牌,比如BYD(比亚迪)

mycar.price=100000
#我汽车的这个价格

现在我配了汽车的俩个信息;那如果是我们以前我们要读取这个配置文件我们要在Car.java里面封装很麻烦现在怎么做(一个注解,叫@ConfigurationProperties):

@ConfigurationProperties
public class Car{...}

ConfigurationProperties.java

package org.springframework.boot.context.properties;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Indexed;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface ConfigurationProperties {

 @AliasFor("prefix")
 String value() default "";

 @AliasFor("value")
 String prefix() default "";

 boolean ignoreInvalidFields() default false;

 boolean ignoreUnknownFields() default true;

}

这个里面有我们要写的东西叫prefix(@AliasFor("prefix")),这个prefix跟这个value()其实都是互相都是别名(@AliasFor)

@ConfigurationProperties(prefix = "mycar")
public class Car{...}

这个prefix指的是这个前缀,这个前缀的意思就是我们这个Car类里面的每一个属性跟配置文件哪个前缀下的属性一 一绑定。我们配置文件里面正好有mycar它的这个品牌名(brand)还有我们这个价格(price)跟我们JavaBean里面的品牌(brand)和价格(price)一模一样所以我就把mycar写上。

写上以后我们为了让它生效,我们把这个组件**加到容器(@Component)**中 , 因为我们容器中的组件才能拥有我们SpingBoot给它提供的强大功能(也就是容器提供的强大功能)

我们来测试一下:

我们Car组件(Car.java)它里的这些值是不是默认已经跟application.properties配置文件里面的mycar它下面的值一 一绑定上了?(写一个Controller进行测试)

HelloController.java

public Car car(){
 return 
}

这个car从哪来? 因为我们用@Component放在容器中了,而且它这个容器中实例的每一个属性的值都跟配置文件中绑定的,所以我想要用的话,直接利用Spring的自动注入(@Autowired)把容器中的Car拿过来就行了

@Autowired
Car car;

@RequestMapping("/car")//处理一个请求
public Car car(){
    return car;//我们返回这Car
}

打开浏览器输入localhost:8080/car,得到的结果为:

{"brand":"BYD","price":100000}

包括我们配置文件改了:

mycar.brand=YD
#我的汽车的这个品牌,比如BYD(比亚迪)

mycar.price=100000
#我汽车的这个价格

注意:配置文件改了我们程序一定要重新启动

然后重新测试:

{"brand":"YD","price":100000}

所以现在想要让一个JavaBean与配置文件里面的东西一 一绑定,我们第一种办法就是@ConfigurationProperties注解 , 我们容器中的组件,标注@ConfigurationProperties注解。

这个方式叫@Component + @ConfigurationProperties

第二个办法,还有一种写的方式

第二个方式就是:

@EnableConfigurationProperties + @ConfigurationProperties

比如我们在配置类(MyConfig)里面(第二种方式一定要在配置类里面写,因为配置类首先是容器中的组件(@Configuration))然后我们在配置类上写什么才能生效?写一个@EnableConfigurationProperties意思就是开启我们这个属性配置功能,开启谁的属性配置功能?我们这个Car想要跟人绑定所以我们把Car

传进@EnableConfigurationProperties()里面来:

@Configuration(proxyBeanMethods = false)//告诉SpringBoot这是一个配置类(把这个类说明@Configuration类似于告诉spring这个文件是配置文件)

@ConditionalOnMissingBean(name = "tom")
@ImportResource("classpath:beans.xml")
@EnableConfigurationProperties(Car.class)
public class MyConfig {...}
 

那我们这个@EnableConfigurationProperties就有俩个功能:

1、开启Car的配置绑定(属性配置)功能

  • 你只有开启了Car的属性配置功能也就是Car.java下面的属性配置才能生效想要开启属性配置功能第一个你明显的标注@EnableConfigurationProperties()开启谁的属性配置功能(这里只Car)。
  • 第二种办法就是你只要这个组件在容器(@Component)中 , 它默认我们提供的这些功能他就能生效

2、把这个组件自动注册到容器中(这里指Car这个组件)

  • 相当于我们就不用再写@Component了。因为有些时候可能是这样子的:我们的这个Car有可能是引用的是第三方包里面的,第三方包里面的人家类里面有可能没标@Component,你是不是也不可能往人家写的类上标@Component, 那咋办呢?我就可以用@EnableConfigurationProperties()把人家的第三方包一整过来。@EnableConfigurationProperties的俩个功能(1)开启了你的配置绑定(2)把你这个使用别人第三方包的组件自动注册到了容器中,我们还能测试生效

我们不用@EnableConfigurationProperties我们只说Car是属性绑定(@ConfigurationProperties)而且没把它加在容器(@Component)中。

***************************
APPLICATION FAILED TO START
***************************

Description:

Field car in com.chentianyu.boot.controller.HelloController required a bean of type 'com.chentianyu.boot.bean.Car' that could not be found.

The injection point has the following annotations:
 - @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 'com.chentianyu.boot.bean.Car' in your configuration.

Process finished with exit code 1

我们启动都报错了,报错的原因就是HelloController.java里面有用Car这个Car在容器中没有,所以拿不到,自动装配(@Autowired)失败,所以我们这一块报错了。

俩种办法

  • 你要么就把它(@ConfigurationProperties)加在容器(@Component)中
  • 要么就使用这种开启功能的方式(@EnableConfigurationProperties)

这俩种都行,这是我们说的配置绑定,有了这个配置绑定那我们后来其实哪怕自定义的一些配置(比如 mycar.brand和mycar.price)你想绑给哪个JavaBean就绑给哪个JavaBean , 只是一个@ConfigurationProperties注解的问题,我们不用再写以前一堆的代码,而且ConfigurationProperties我们在未来SpringBoot底层大家经常见到,你见到这个东西@ConfigurationProperties就说明这个类(Car)中的所有属性是跟SpringBoot核心配置文件(application.properties),你也不能随便写一个别的文件 它绑定不上,是跟我们application.properties这个核心文件里面prefix = "mycar"这个前缀下边的所有东西进行绑定的

到此这篇关于SpringBoot中@ConfigurationProperties 配置绑定的文章就介绍到这了,更多相关@ConfigurationProperties 配置绑定内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • maven打包web项目时同时打包为war和jar文件的方法

    maven打包web项目时同时打包为war和jar文件的方法

    本篇文章主要介绍了maven打包web项目时同时打包为war和jar文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • springcloud feign docker上无法通讯的问题及解决

    springcloud feign docker上无法通讯的问题及解决

    这篇文章主要介绍了springcloud feign docker上无法通讯的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java实战宠物店在线交易平台的实现流程

    Java实战宠物店在线交易平台的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+Springboot+maven+Mysql+FreeMarker实现一个宠物在线交易系统,大家可以在过程中查缺补漏,提升水平
    2022-01-01
  • 用Java实现24点游戏

    用Java实现24点游戏

    喜欢玩游戏的有福啦,文中有非常详细的开发框架,按着框架来实现就好啦.而且24点游戏是经典的纸牌益智游戏.,需要的朋友可以参考下
    2021-05-05
  • Java中数字黑洞实现代码

    Java中数字黑洞实现代码

    这篇文章主要介绍了Java编程中如何实现数字黑洞算法游戏,其中涉及到了数组、scanner、if语句等Java编程的基础知识,需要的朋友可以参考下
    2017-09-09
  • IDEA怎么设置maven配置

    IDEA怎么设置maven配置

    这篇文章主要介绍了IDEA怎么设置maven配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Activiti如何动态获取流程图过程详解

    Activiti如何动态获取流程图过程详解

    这篇文章主要介绍了Activiti如何动态获取流程图过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java生成sm2/hutool生成公钥私钥代码示例

    java生成sm2/hutool生成公钥私钥代码示例

    这篇文章主要给大家介绍了关于java生成sm2/hutool生成公钥私钥的相关资料,Java是一种广泛使用的编程语言,可以用来生成公钥和私钥文件,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • JDK8中新增的Optional工具类基本使用

    JDK8中新增的Optional工具类基本使用

    Optional不是对null关键字的一种替代,而是对于null判定提供了一种更加优雅的实现,接下来通过本文给大家分享JDK8中新增的Optional工具类基本使用,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • Java详细讲解IO流的Writer与Reader操作

    Java详细讲解IO流的Writer与Reader操作

    Writer与Reader类不能直接调用,需要使用多带的方法调用它们的子类,在他们的前边加上一个File即可如(FileWriter或FileReader)的多态方法进行其调用,并且他们也是抽象类调用需要连接接口Exception,它们的优点在于可以直接写入或读出内容,不需要使用byte转八进制
    2022-05-05

最新评论