SpringBoot中怎么使用@ConfigurationProperties
导读:本文共4147.5字符,通常情况下阅读需要14分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: @ConfigurationProperties@ConfigurationProperties告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;要进行绑定,首先这个类要受Spring管理,spring才能操作里面的数据。使用场景场景一:使用@ConfigurationProperties和@Component注解到bean定义类上.注意... ...
目录
(为您整理了一些要点),点击可以直达。@ConfigurationProperties
@ConfigurationProperties告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;要进行绑定,首先这个类要受Spring管理,spring才能操作里面的数据。
使用场景
场景一:使用@ConfigurationProperties和@Component注解到bean定义类上.
注意,这里是到bean定义类上,这里的bean指的是受Spring管理的bean,而@Component注解就是把一个类当成一个bean注册到Spring容器中。
自定义一个配置文件:
book:bookName:Spring技术内幕price:36.57
定义一个bean:
packagecom.example.entity;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;packagecom.example.entity;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;/***@author不止于梦想*@date2022/11/718:50*/@Component//交给Spring容器管理@ConfigurationProperties(prefix="book")//加载配置文件,配置前缀表达式@DatapublicclassBook{//书名privateStringbookName;//价格privatedoubleprice;}
注意看,此时是有@Component注解的,说明这个bean受Spring容器管理。
测试:
packagecom.example.springbootconfigureadvanced;importcom.example.entity.Book;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;@SpringBootTestclassSpringBootConfigureAdvancedApplicationTests{@AutowiredBookbook;@TestvoidcontextLoads(){}@TestpublicvoidtoTest(){System.out.println(book.getPrice());}}
结果:
此时如果把@component去掉:
直接爆红了,语法都不给你通过,这说明了要@ConfigurationProperties生效,被注入的bean应该要受Spring管理或者说在Spring容器中。
场景二:使用@ConfigurationProperties和@Bean注解在配置类的Bean定义方法上
解释一下:如果我们使用注解开发,一般会把第三方技术写成一个配置类,然后使用@ConfigurationProperties和@Bean注解对其进行注入,从而实现对第三方属性的绑定。
注意这里的两个注解使用在方法上,但是要绑定,这个类必须得让Spring管理,所以需要一个注解来显示这个类,让Spring能够扫描到,以便与可以把其添加到容器中。
新建一个配置类:
packagecom.example.config;importcom.alibaba.druid.pool.DruidDataSource;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;/***@author不止于梦想*@date2022/11/719:51*/@Configuration//声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。publicclassMyConfig{@ConfigurationProperties(prefix="datasource")@BeanpublicDruidDataSourcedataSource(){DruidDataSourcedataSource=newDruidDataSource();returndataSource;}}
添加配置:
dataSource:url:jdbc:mysql://127.0.0.1:3306/springBoot?serverTimezone=UTC
注意这里并没有用spring.dataSource格式,如果是那样,倒不如直接在配置文件配好,瞎整配置类干啥。
测试:
packagecom.example;importcom.alibaba.druid.pool.DruidDataSource;importcom.example.entity.Book;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;@SpringBootApplicationpublicclassSpringBootConfigureAdvancedApplication{publicstaticvoidmain(String[]args){//获取应用上下文配置ConfigurableApplicationContextcontext=SpringApplication.run(SpringBootConfigureAdvancedApplication.class,args);DruidDataSourcedataSource=context.getBean(DruidDataSource.class);System.out.println(dataSource.getUrl());}}
这里我们直接在SpringBoot应用类获取应用上下文配置即可获取容器中的bean,不用再费劲去测试类整一堆东西;
验证:
解释一下,不然不清楚:在上面配置类MyConfig中设置了一个方法,返回值就是数据源对象,就是说使用方法创建了数据源对象,然后使用@Bean把这个方法定义为一个受Spring管理的bean,再使用@ConfigurationProperties(prefix = “datasource”)加载配置文件进入数据源对象,但是这样还不够,这个类Spring并不能扫描到,所以使用@Configuration把这个类定义为配置类,这样就可以加载这个类。
在这里没有的配置文件中的dataSource只是一个普通的配置。
场景三:使用@ConfigurationProperties注解到普通类,然后再通过@EnableConfigurationProperties定义为Bean。
先说一下@EnableConfigurationProperties的用法:这个注解相当于一个开关,用来开启配置的绑定,使用这个注解,不用把类手动交给Spring加载成bean,直接在这个注解后面加上你要开启配置的类的类名.class即可,这个注解会告诉Spring把类加载成bean,并放入容器中。
说白了就是让@ConfigurationProperties生效。
还是上面的例子:
没加@EnableConfigurationProperties、也没有加其他制成bean的注解:
加上@EnableConfigurationProperties
测试:
小结
1、注意三种使用情况,特别是第三种,在后面的原理篇会大量出现
2、@EnableConfigurationProperties是一个开关,用来开启被@ConfigurationProperties注解注释而没有其他生成bean注解的类与配置文件注入的开关。
宽松绑定/松散绑定
@ConfigurationProperties绑定属性支持属性名宽松绑定
总的概况就是,只要配置文件的配置的字母数量和字母与被绑定的bean的prefix(前缀)相同都可以绑定,但是注意,prefix的内容全部为小写。配置文件可以出现大小写不一致,甚至可以出现各种符号(非abcd这些)。
绑定前缀名命名规范:仅能使用纯小写字母、数字、下划线作为合法的字符
举例:配置文件
dataSource:url:jdbc:mysql://127.0.0.1:3306/springBoot?serverTimezone=UTC
类中:
可以看到,虽然这里的前缀和配置文件完全相同,但是还是不正确的,prefix必须全为小写。
说完了吗?说完了,其他的试一下就可以,一通百通。
啊,还有就是:
宽松绑定不支持注解@Value引用单个属性的方式
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
SpringBoot中怎么使用@ConfigurationProperties的详细内容,希望对您有所帮助,信息来源于网络。