[Java] 迅速学会@ConfigurationProperties的使用操作

  • A+
所属分类:其他教程
摘要

DSC0000.jpg 下载附件 2022-2-14 13:37 上传DSC0001.jpg 下载附件 2022-2-14 13:37 上传

这篇文章主要介绍了迅速学会@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属性,通过指定的前缀,绑定配置文件中的配置,该注解可以放在类上,也可以放在方法上

[Java] 迅速学会@ConfigurationProperties的使用操作

DSC0000.jpg

2022-2-14 13:37 上传

可以从注解说明中看到,当将该注解作用于方法上时,如果想要有效的绑定配置,那么该方法需要有@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,此时你只需要在注解中加上以下参数即可

[Java] 迅速学会@ConfigurationProperties的使用操作

DSC0001.jpg

2022-2-14 13:37 上传

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

作用于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”
以上为个人经验,希望能给大家一个参考,也希望大家多多支持OPEN开发家园
原文链接:https://blog.csdn.net/nsplnpbjy/article/details/106359154

关注下面的标签,发现更多相似文章
  • 主要
  • 学会
  • 操作
  • 使用
  • 介绍
  • 文章

  • 我的微信公众号
  • 扫一扫关注
  • weinxin
  • 我的新浪微博号
  • 扫一扫关注
  • weinxin
小辉博客

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: