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 配置绑定内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

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

  • @ConfigurationProperties绑定配置信息至Array、List、Map、Bean的实现

    相关说明: 在SpringBoot中,我们可以通过以下几种方式获取并绑定配置文件中的信息: @Value注解. 使用Environment. @ConfigurationProperties注解. 通过实现ApplicationListener接口,注册监听器,进行硬编码获取,可参考:https://www.jb51.net/article/187407.htm 硬编码加载文件获取. -- 注:一般情况下,第一种.第二种就够用了;但是如果想直接从配置文件中获取到数组.list.map.对象的话,

  • SpringBoot中@ConfigurationProperties 配置绑定

    SpringBoot底层的一个功能 : @ConfigurationProperties @ConfigurationProperties 配置绑定 来举一个场景例子 : 我们习惯于把经常变化的一个东西配到配置文件里面.比如把数据库的一些链接地址.账号.密码包括数据库连接池的大小等等这些属性配到properties配置文件里面,然后为了方便 , 因为我们未来可能要创建数据库连接池,我们会把这个配置文件里面的内容又一一解析到我们数据库连接池(比如javaBean我们这个对象里面),所以我们这个实现

  • SpringBoot中@ConfigurationProperties注解实现配置绑定的三种方法

    properties配置文件如下: human.name=Mr.Yu human.age=21 human.gender=male 如何把properties里面的配置绑定到JavaBean里面,以前我们的做法如下: public class PropertiesUtil { public static void getProperties(Person person) throws IOException { Properties properties = new Properties();

  • SpringBoot2底层注解@ConfigurationProperties配置绑定

    目录 配置绑定 验证 另一种方式 我们通常会把一些经常变动的东西放到配置文件里. 比如之前写在配置文件application.properties里的端口号server.port=8080,另外常见的还有数据库的连接信息等等. 那么,我的数据库连接信息放在配置文件里,我要使用的话肯定得去解析配置文件,解析出的内容在 bean 里面去使用. 整个场景其实就是把配置文件里的所有配置,绑定到 java bean 里面. 要完成这个场景,基于 java 原生代码编写还是有点麻烦的.通常会做一个封装,读取

  • SpringBoot中@ConfigurationProperties实现配置自动绑定的方法

    目录 代码 构造器绑定 结合@PropertySource 代码 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&

  • SpringBoot中的配置类(@Configuration)

    目录 SpringBoot基于java类的配置 第一步 第二步 第三步 第四步测试 SpringBoot自定义配置类 1.方式一 2.方式二 SpringBoot基于java类的配置 java配置主要靠java类和一些注解来达到和xml配置一样的效果,比较常用的注解有: @Configuration:声明一个类作为配置类,代替xml文件 @Bean:声明在方法上,将方法的返回值加入Bean容器,代替标签 @Value:属性注入 @PropertySource:指定外部属性文件(propertie

  • SpringBoot中自定义参数绑定步骤详解

    正常情况下,前端传递来的参数都能直接被SpringMVC接收,但是也会遇到一些特殊情况,比如Date对象,当我的前端传来的一个日期时,就需要服务端自定义参数绑定,将前端的日期进行转换.自定义参数绑定也很简单,分两个步骤: 1.自定义参数转换器 自定义参数转换器实现Converter接口,如下: public class DateConverter implements Converter<String,Date> { private SimpleDateFormat simpleDateFor

  • 详解SpringBoot和Mybatis配置多数据源

    目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑.在SpringBoot中也可以实现多数据源并配合Mybatis框架编写xml文件来执行SQL.在SpringBoot中,配置多数据源的方式十分便捷, 下面开始上代码: 在pom.xml文件中需要添加一些依赖 <!-- Spring Boot Mybatis 依赖 --> <dependency> <groupId>org.mybatis.spring.b

  • 在SpringBoot中使用Logback管理记录日志

    SpringBoot的默认日志配置 SpringBoot 开箱即用,默认帮你配置了日志框架,使用 Commons Logging ,但是默认配置也提供了对常用日志的支持,如: Java Util Logging , Log4J , Log4J2 和 Logback.每种Logger都可以通过配置使用控制台或者文件输出日志内容. 控制台输出 关于log日志,首先说说的5个日志级别 LEVEL: 从高到低分别是 ERROR . WARN . INFO . DEBUG . TRACE 低级别的会输出高

  • 如何在SpringBoot 中使用 Druid 数据库连接池

    Druid是阿里开源的一款数据库连接池,除了常规的连接池功能外,它还提供了强大的监控和扩展功能.这对没有做数据库监控的小项目有很大的吸引力. 下列步骤可以让你无脑式的在SpringBoot2.x中使用Druid. 1.Maven中的pom文件 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.14</ve

  • springboot中关于自动建表,无法更新字段的问题

    目录 关于自动建表,无法更新字段问题 Springboot中的配置 除了create配置,还有以下几种 springbootjpa未自动建表问题记录 检查pom是否正确引入对应模块 检查application文件配置是否存在错误 关于自动建表,无法更新字段问题 Springboot中的配置 jpa:     database-platform: org.hibernate.dialect.MySQL5InnoDBDialect     database: MYSQL     show-sql:

随机推荐