Spring Boot 构造器参数绑定,越来越强大了!
在之前的文章:Spring Boot读取配置的几种方式,我介绍到 Spring Boot 中基于 Java Bean 的参数绑定,在一个 Java Bean 类上用 @ConfigurationProperties
注解标识(更多 Spring Boot 的教程请关注公众号 "Java技术栈" 在后台回复:boot)。
前几天,Spring Boot 2.2.0 正式发布了:Spring Boot 2.2.0 正式发布,支持 JDK 13!,文中有提到基于构造器的参数绑定,那么今天栈长就带大家来实践一下,到底怎么用,有什么用。
废话不说,先上示例代码:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.boot.context.properties.bind.DefaultValue;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 微信公众号:Java技术栈
*/
@ConstructorBinding
@ConfigurationProperties(prefix = "tom")
public class TomProperties {
private String name;
private String sex;
private int age;
private String country;
private Date entryTime;
public TomProperties(String name,
String sex,
int age,
@DefaultValue("China") String country,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date entryTime) {
this.name = name;
this.sex = sex;
this.age = age;
this.country = country;
this.entryTime = entryTime;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public int getAge() {
return age;
}
public String getCountry() {
return country;
}
public Date getEntryTime() {
return entryTime;
}
@Override
public String toString() {
return "TomProperties{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", country='" + country + '\'' +
", entryTime=" + entryTime +
'}';
}
}
配置文件内容:
tom:
name: Tom
sex: man
age: 18
entry-time: 2012-12-12 12:00:00
参数结果输出:
TomProperties{name='Tom', sex='man', age=18, country='China', entryTime=Wed Dec 12 12:00:00 CST 2012}
通过构造器的参数绑定,其实就是在 @ConfigurationProperties
注解的基础上再添加一个 '@ConstructorBinding' 注解。
@ConstructorBinding几点总结:
1、用了 @ConstructorBinding
这个注解,就标识这个类的参数优先通过带参数的构造器注入,如果没有带参数的构造器则再通过 setters 注入;
怎么判断是通过 setters 注入还是构造器注入,请看这个类的源码:
org.springframework.boot.context.properties.ConfigurationPropertiesBean.BindMethod
2、当 @ConstructorBinding
用在类上时,该类只能有一个带参数的构造器;如果有多个构造器时,可以把 @ConstructorBinding
直接绑定到具体的构造方法上;
3、成员变量可以是 final
不可变;
4、支持该类的内部类构造器注入的形式;
5、支持默认值 @DefaultValue
、@DateTimeFormat
时间格式等注解配合使用;
6、需要配合 @ConfigurationProperties
、@EnableConfigurationProperties
注解使用;
7、不支持像 @Component
、@Bean
、@Import
等方式创建 bean 的构造器参数绑定;
来看下它的源码:
@Target({ElementType.TYPE, ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ConstructorBinding {
}
什么参数都没有,可以说明,它就是起到一个构造器参数绑定的标识作用。
涨姿势了吧??又学会了一种绑定参数的新方法了!
获取所有 Spring Boot 示例代码,请关注微信公众号 "Java技术栈" 在后台回复关键字:bootcode。
未完,栈长将陆续分享 Spring Boot 最新技术教程,现在已经写了一堆存货了,关注微信公众号 "Java技术栈" ,公众号第一时间推送!
Spring Boot 构造器参数绑定,越来越强大了!的更多相关文章
- Spring Boot中使用Swagger2构建强大的RESTful API文档
由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...
- Kotlin + Spring Boot 请求参数验证
编写 Web 应用程序的时候,经常要做的事就是要对前端传回的数据进行简单的验证,比如是否非空.字符长度是否满足要求,邮箱格式是否正确等等.在 Spring Boot 中,可以使用 Bean Valid ...
- Spring boot 配置文件参数映射到配置类属性
[参考文章]:SpringBoot之@EnableConfigurationProperties分析 [参考文章]:在Spring Boot中使用 @ConfigurationProperties 注 ...
- Spring Boot 中使用 Swagger2 构建强大的 RESTful API 文档
项目现状:由于前后端分离,没有很好的前后端合作工具. 由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型.HTTP头部信息.HTTP请求内容等),高质量地创建这份文档本身就是件非常吃力的事,下 ...
- spring boot 输入参数统一校验
1 引入spring boot validate maven 依赖 <!-- 验证 --> <dependency> <groupId>org.hiberna ...
- Spring MVC温故而知新 – 参数绑定、转发与重定向、异常处理、拦截器
请求参数绑定 当用户发送请求时,根据Spring MVC的请求处理流程,前端控制器会请求处理器映射器返回一个处理器,然后请求处理器适配器之心相应的处理器,此时处理器映射器会调用Spring Mvc 提 ...
- Spring MVC请求参数绑定
所谓请求参数绑定,就是在控制器方法中,将请求参数绑定到方法参数上 @RequestParam 绑定单个请求参数到方法参数上 @RequestParam("id") Integer ...
- 【spring boot】3.spring boot项目,绑定资源文件为bean并使用
整个例子的结构目录如下: 1.自定义一个资源文件 com.sxd.name = 申九日木 com.sxd.secret = ${random.value} com.sxd.intValue = ${r ...
- Spring MVC初始化参数绑定
初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法 使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型 proper ...
随机推荐
- linux 下 的串口模拟器 minicom 退出方法
ctrl + a (或 A) 进入 minicom 的配置模式:终端外观上无任何变化! 然后按下 z (或 Z) 方可打开配置帮助界面 然后按下 x (或 X)退出
- nginx dockerfile安装第三方模块
# nginx Dockerfile # Version 1.0 # author fendo # Base images 基础镜像 FROM centos:centos7 #FROM hub.c.. ...
- 【mybatis】mybatis一条sql更新两张数据表,mybatis关联更新多张数据表
示例sql: <update id="receipt" parameterType="com.pisen.cloud.luna.ms.security.code.b ...
- WPF 精修篇 事件触发器
原文:WPF 精修篇 事件触发器 事件触发器 一般使用的就是动画 <Grid> <TextBlock Text="事件触发器" Opacity="0.2 ...
- vue-Element-axios搭建调用api进行数据展示
1全局安装vue-cli 输入命令:npm install vue-cli -g 2创建项目框架 输入命令:vue init webpack vueapi 3依次按照提示输入,项目名.项目描述.项目作 ...
- Eureka重要对象简介
在进行分析EurekaClient和EurekaServer之间通信的源码之前,我们首先需要熟悉一下几个实体类 InstanceInfo 这个类代表着EurekaClient实例,客户端向服务端请求注 ...
- 5.css三角的做法
如上图所示,类似这样的小三角都可以通过以下代码写出: .box1 { width: ; height: ; /* border: 10px solid pink; */ border-top: 10p ...
- Spring MVC + CXF实现webservice接口
本来都是WebAPI/RestfulAPI接口对外提供接口的,突然有个需求要提供WebService接口,本想着Spring和CXF这么成熟的两个产品,这么的也整不出什么幺蛾子来啊. 结果还真是出了几 ...
- 面向对象(五)--isinstance与issubclass方法、反射、内置方法(部分)、异常处理
一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,class) 2.issubclass是用来判断一个类是否为另一个 ...
- zabbix3.4配置第三方邮件报警
废话不多说,直接进入主题. 1.安装mailx [root@localhost ~]#yum install malix -y #yum安装malix [ ...