springboot松散绑定

简介: springboot松散绑定

问题引进

在进行属性绑定时,可能会遇到如下情况,为了进行标准命名,开发者会将属性名严格按照驼峰命名法书写,在yml配置文件中将datasource修改为dataSource,如下:

dataSource:
  driverClassName: com.mysql.jdbc.Driver

此时程序可以正常运行,然后又将代码中的前缀datasource修改为dataSource,如下:

@Bean
@ConfigurationProperties(prefix = "dataSource")
public DruidDataSource datasource(){
    DruidDataSource ds = new DruidDataSource();
    return ds;
}

此时就发生了编译错误,而且并不是idea工具导致的,运行后依然会出现问题,配置属性名dataSource是无效的

Configuration property name 'dataSource' is not valid:
    Invalid characters: 'S'
    Bean: datasource
    Reason: Canonical names should be kebab-case ('-' separated), lowercase alpha-numeric characters and must start with a letter
Action:
Modify 'dataSource' so that it conforms to the canonical names requirements.

规范的名称应该是烤肉串(kebab)模式(case),即使用-分隔,使用小写字母数字作为标准字符,且必须以字母开头。  

宽松绑定  

springboot进行编程时人性化设计的一种体现,即配置文件中的命名格式与变量名的命名格式可以进行格式上的最大化兼容。兼容到什么程度呢?几乎主流的命名格式都支持,例如:

@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
}

可以与下面的配置属性名规则全兼容:

servers:
  ipAddress: 192.168.0.3       # 驼峰模式
  ip_address: 192.168.0.3      # 下划线模式
  ip-address: 192.168.0.3      # 烤肉串模式
  IP_ADDRESS: 192.168.0.3      # 常量模式

以上4种模式最终都可以匹配到ipAddress这个属性名。  

原因就是在进行匹配时,配置中的名称要去掉中划线和下划线后,忽略大小写的情况下去与java代码中的属性名进行忽略大小写的等值匹配,以上4种命名去掉下划线中划线忽略大小写后都是一个词ipaddress,java代码中的属性名忽略大小写后也是ipaddress,这样就可以进行等值匹配了,这就是为什么这4种格式都能匹配成功的原因。不过springboot官方推荐使用烤肉串模式,也就是中划线模式。

以上规则仅针对springboot中@ConfigurationProperties注解进行属性绑定时有效,对@Value注解进行属性映射无效。

  1. @ConfigurationProperties绑定属性时支持属性名宽松绑定,这个宽松体现在属性名的命名规则上
  2. @Value注解不支持松散绑定规则
  3. 绑定前缀名推荐采用烤肉串命名规则,即使用中划线做分隔符
Property Note

my.main-project.person.first-name

Kebab 风格(短横线隔开),建议在 .properties 和 YAML 文件中使用。

my.main-project.person.firstName

标准的驼峰语法。

my.main-project.person.first_name

下划线,这是一种用于 .properties 和 YAML 文件的替代格式。

MY_MAINPROJECT_PERSON_FIRSTNAME

大写格式,在使用系统环境变量时建议使用大写格式

注解的 prefix必须 是kebab风格(小写并以 - 分隔,如 my.main-project.person )。

@Value(补充)

在Spring框架中,@Value注解是用来注入外部化配置文件或者系统属性的值。通过使用这个注解,我们可以注入一些简单类型的值(int,String,boolean等),也可以注入一个复杂对象。这个注解可以标记在类的属性上,表示将该属性的值与配置文件中的某个属性的值进行绑定。

@Value("${example.property}") 
private String exampleProperty;

使用@Value注解将配置文件中配置的值 进行自动注入的时候,经常会出现的一个问题就是:若我们忘记在配置文件中配置该参数 则会造成项目启动报错。

我们可以通过给被@Value注解作用的变量进行注入的时候,如果没有找到该配置参数时 设置一个默认值,相当于是一个兜底的方案。

@Value("${example.property:xxx}") 
private String exampleProperty;

被static修饰的变量通过@Value会注入失败 ,如果真的需要可以选择以下形式

public static String port;
@Value("${spring.port:8080}")
public void setPort(String port){
  Test.port = port;
}

三种常见用法

@Value(“${xxxx}”)注解从配置文件读取值的用法

常量注入

@Value("xxx")
privat String name;

@Value(“#{}”)是获取bean属性,系统属性,表达式( SpEL表达式)

SpEL表达式语言是一种表达式语言,是一种可以与一个基于spring的应用程序中的运行时对象交互的东西。有点类似于ognl表达式。总得来说SpEL表达式是一种简化开发的表达式,通过使用表达式来简化开发,减少一些逻辑、配置的编写。


相关文章
|
7月前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
76 1
|
7月前
|
开发框架 Java .NET
SpringBoot3中的属性绑定注解和YMAL配置文件、日志
SpringBoot3中的属性绑定注解和YMAL配置文件、日志
|
Java Spring
Springboot属性配置绑定
Springboot属性配置绑定
53 0
|
SQL 算法 Java
springboot中sharding jdbc绑定表配置实战
springboot中sharding jdbc绑定表配置实战
SpringBoot2学习(二):配置绑定
首先抛出一个问题:如何使用Java读取到properties文件中的内容,并且把它封装到JavaBean中,以供随时使用 这就需要用到今天要说的配置绑定。
110 0
SpringBoot2学习(二):配置绑定
|
Java 大数据 数据库
Spring Boot配置绑定
你好看官,里面请!今天笔者讲的是Spring Boot配置绑定。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
221 2
|
JSON Java 数据格式
【SpringBoot】配置文件的加载与属性值的绑定
【SpringBoot】配置文件的加载与属性值的绑定
【SpringBoot】配置文件的加载与属性值的绑定
|
Java 容器
SpringBoot2.x基础篇:谈谈SpringBoot内提供的这几种配置绑定
`SpringBoot`在不断地版本迭代中陆续提供了不同的配置参数绑定的方式,我们可以单独获取`一个配置参数`也可以将`一系列的配置`映射绑定到`JavaBean`的属性字段,下面我们来看看这几种方式的配置绑定哪一种是你最常用到的。
SpringBoot2.x基础篇:谈谈SpringBoot内提供的这几种配置绑定
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
162 1