ConfigurationProperties介绍
ConfigurationProperties是一个注解,可以标注在一个Class上,这样Spring Boot会从Environment中获取其属性对应的属性值给其进行注入。比如下面的代码定义中,Spring Boot在实例化TestConfigurationProperties这个bean时就会把从Environment中获取属性名为appName的属性值赋给TestConfigurationProperties的appName属性。
@ConfigurationProperties
@Data
public class TestConfigurationProperties {
private String appName;
}
所以当你的application.properties文件中定义了appName=Test
时就会把Test
赋值给TestConfigurationProperties对象的appName属性。实际上下面的定义和appName=Test
是等价的。也就是说在从Environment中获取属性值绑定到ConfigurationProperties标注的对象上时,对大小写是不敏感的,而且其中的-
和_
都会被剔除。
APPname=Test
app-Name=Test
app-name=Test
app_name=Test
@ConfigurationProperties
标注的Class通常用于从Environment中绑定属性值,然后供bean容器中的其它bean使用,通常是跟@Configuration
标注的Class一起使用,其内部会注入@ConfigurationProperties
标注的对象用来定义bean。如果你去查看Spring Boot的AutoConfiguration包,你会发现里面基本都是这样的用法。单独跟@Configuration
标注的Class一起使用时,通常还会在@Configuration
标注的Class上加上@EnableConfigurationProperties
指定允许使用的标注了@ConfigurationProperties
的配置类,这样Spring Boot就会把它实例化为一个bean,然后在@Configuration
配置类中就可以进行依赖注入并进行使用了。以下代码就是一个简单的示例。
@Configuration
@EnableConfigurationProperties(TestConfigurationProperties.class)
public class TestConfig {
@Autowired
private TestConfigurationProperties props;
@Bean
public Object initBean() {
//使用注入的ConfigurationProperties标注的对象进行bean构造
return this.props.getAppName();
}
}
当
@ConfigurationProperties
标注的Class本身就标注为一个bean定义时就不需要在@Configuration
标注的Class上使用@EnableConfigurationProperties
进行指定了,可以直接进行注入,因为它已经是一个bean了。
指定需要映射的前缀
在application.properties文件中定义的属性通常不是单一名称的属性,而是以a.b.c.d
这种形式构成的属性,多个层级之间以点分隔,从而形成不同的分类。这种属性需要绑定到@ConfigurationProperties
标注的对象属性上时可以指定一个通用的前缀,然后只对去除前缀之后的内容进行绑定。下面的代码指定了绑定属性时的前缀是test.config
,所以TestConfigurationProperties对象的username属性将绑定配置文件中的test.config.username
属性,password属性将匹配配置文件中的test.config.password
属性。
@ConfigurationProperties("test.config")
@Data
public class TestConfigurationProperties {
private String username;
private String password;
}
当在application.properties文件中进行了如下定义时,TestConfigurationProperties对象的username属性绑定的值是u1
,password属性绑定的值是p1
。
test.config.username=u1
test.config.password=p1
@ConfigurationProperties
中有一个属性value用来指定前缀,属性prefix也可以用来指定前缀。有一个ignoreInvalidFields
用来指定当需要绑定的属性值不合法时是否需要忽略该属性绑定,属性不合法主要是指类型不匹配。比如需要绑定值的属性定义的类型是int,通过自动绑定机制获取到的属性值是abc
,它就不能转换为int。ignoreInvalidFields
默认是false
,即当出现属性不合法时将不忽略,将抛出异常。还有一个ignoreUnknownFields
属性,用来指定当需要绑定值的属性没有找到对应的绑定属性时是否将忽略,默认是true
。
级联绑定
下面的代码中TestConfigurationProperties的inner属性是一个对象,需要对其进行绑定时需要以.
进行级联绑定。
@ConfigurationProperties("test.config")
@Data
public class TestConfigurationProperties {
private Inner inner;
@Data
public static class Inner {
private String username;
private String password;
}
}
在application.properties文件中进行如下定义会为TestConfigurationProperties对象的inner属性绑定一个Inner对象,其username属性的值是u1,password的值是p1。
test.config.inner.username=u1
test.config.inner.password=p1
在application.yml文件中进行如下定义与上面的定义等价。
test.config.inner:
username: u1
password: p1
绑定集合属性
下面的代码中使用@ConfigurationProperties
标注的Class有一个List类型的属性。
@ConfigurationProperties("test.config")
@Data
public class TestConfigurationProperties {
private List<String> list;
}
需要给List绑定值时,可以通过[index]
的形式指定值,下面的代码就定义了List中的三个元素,分别是ABC
、DEF
和GHI
。
test.config.list[0]=ABC
test.config.list[1]=DEF
test.config.list[2]=GHI
也可以使用英文逗号分隔List中的多个值,以下配置跟上面的配置是等价的。
test.config.list=ABC,DEF,GHI
Set、Array类型的属性值绑定也可以使用类似的语法(索引和逗号分隔)。
在YAML配置文件定义集合类型的值绑定时可以定义为如下这样:
test.config.list:
- ABC
- DEF
- GHI
它也可以使用逗号分隔的多个值。
test.config.list: ABC,DEF,GHI
如果需要绑定值的集合元素是一个对象怎么办呢?下面的代码中list属性的元素类型就是一个Inner对象,其中Inner对象又有username和password两个属性。
@ConfigurationProperties("test.config")
@Data
public class TestConfigurationProperties {
private List<Inner> list;
@Data
public static class Inner {
private String username;
private String password;
}
}
在application.properties文件中进行如下定义可以为list属性绑定两个Inner对象,其中第一个对象的username属性值为u1,password属性值为p1;第二个对象的username属性值为u2,password属性值为p2。
test.config.list[0].username=u1
test.config.list[0].password=p1
test.config.list[1].username=u2
test.config.list[1].password=p2
在application.yml文件中进行如下定义与上面的定义等价,可以达到相同的值绑定效果。
test.config.list:
-
username: u1
password: p1
-
username: u2
password: p2
绑定Map属性
下面的代码中拥有一个Map类型的map属性,Key和Value都是String类型。
@ConfigurationProperties("test.config")
@Data
public class TestConfigurationProperties {
private Map<String, String> map;
}
需要给上面的map属性绑定值时可以使用key=value
的形式,下面的配置会给map属性绑定两个元素,分别是key1对应value1,key2对应value2。
test.config.map.key1=value1
test.config.map.key2=value2
在application.yml文件中使用YAML语法定义就更简单了,以下定义等价于上面的定义。
test.config.map:
key1: value1
key2: value2
如果需要绑定的Value是一个对象怎么办呢?比如map属性的定义改为如下这样:
@ConfigurationProperties("test.config")
@Data
public class TestConfigurationProperties {
private Map<String, Inner> map;
@Data
public static class Inner {
private String username;
private String password;
}
}
在application.properties文件中进行如下定义,会绑定两个元素到map,第一个元素的Key是key1,Value是一个Inner对象,其username属性的值是u1,password属性的值是p1;第二个元素的Key是key2,Value的username属性的值是u2,password属性的值是p2。
test.config.map.key1.username=u1
test.config.map.key1.password=p1
test.config.map.key2.username=u2
test.config.map.key2.password=p2
在application.yml文件中定义时,如下定义等价于上面的定义。
test.config.map:
key1:
username: u1
password: p1
key2:
username: u2
password: p2
使用JSR303注解进行有效性校验
可以对@ConfigurationProperties
标注的Class的属性进行有效性校验,要使校验生效,需要在Class上添加@org.springframework.validation.annotation.Validated
,还需要Classpath下拥有JSR303 Validator的实现,比如Hibernate Validator,这样Spring Boot在进行属性值绑定后会校验其合法性。下面的代码中就指定了name属性不能为null或空字符串,如果绑定后的值为空将抛出异常。
@Validated
@ConfigurationProperties("test.config")
@Data
public class TestConfigurationProperties {
@NotBlank(message="参数test.config.name不能为空")
private String name;
}
如果需要进行属性值绑定的属性是一个对象,需要对该对象中的某个属性进行合法性校验,比如下面代码中需要对Inner对象中的username属性进行非空校验,则需要在inner属性上加上@Valid
,同时在username属性上加上@NotBlank
。
@Validated
@ConfigurationProperties("test.config")
@Data
public class TestConfigurationProperties {
@NotBlank(message="参数test.config.name不能为空")
private String name;
@Valid
private Inner inner;
@Data
public static class Inner {
@NotBlank(message="参数test.config.inner.username不能为空")
private String username;
private String password;
}
}
绑定属性值到第三方jar中包含的Class
如果需要绑定属性值到第三方jar中包含的Class对象,我们是无法直接在Class上加上@ConfigurationProperties
注解的,这时候可以在@Configuration
标注的Class中定义一个需要绑定值的Class类型的bean,然后在该方法上加上@ConfigurationProperties
。比如下面代码中通过initTestConfigurationProperties()
定义了一个TestConfigurationProperties类型的bean,在该方法上加上了@ConfigurationProperties
,Spring Boot就会为该bean进行属性值绑定。
@Configuration
public class TestConfig {
@Bean
@ConfigurationProperties("test.config")
public TestConfigurationProperties initTestConfigurationProperties() {
return new TestConfigurationProperties();
}
}
参考文档
(注:本文是基于Spring Boot 2.0.3所写)
相关推荐
- **使用Spring Boot**:详细介绍Spring Boot的基本用法,包括其核心特性和优势。 - **了解Spring Boot特性**:深入解析Spring Boot的关键特性,如自动配置、starter依赖等。 - **迁移到生产环境**:指导如何将...
在深入探讨Spring Boot启动原理之前,首先需要理解的是Spring Boot的核心注解——`@SpringBootApplication`。这个注解是一个复合注解,包含了`@Configuration`、`@EnableAutoConfiguration`和`@ComponentScan`这三个...
接下来,笔记详细讲解了Spring Boot的主配置文件——application.properties或application.yml。这些配置文件用于定制自动配置行为,调整应用的行为,如端口设置、数据库连接信息等。此外,还介绍了如何通过@...
在Java开发领域,Spring Boot已经成为了企业级应用开发的主流框架。它简化了Spring应用程序的初始设置和配置,使得开发者可以更快地投入到实际的业务逻辑开发中。在面试环节,对于Spring Boot的理解和掌握程度往往是...
《Spring Boot源代码解析——Chapter 01概览》 Spring Boot是Java开发中的一个热门框架,它简化了创建独立的、生产级别的基于Spring的应用程序的过程。本章将深入探讨"hello spring boot"项目的源代码,揭示其内在...
《Spring Boot源码深度解析——以demospringboot为例》 Spring Boot作为现代Java开发的首选框架,以其简洁、高效和快速启动的特点深受开发者喜爱。本文将以“demospringboot”项目为例,深入剖析Spring Boot的源码...
本文将详细讲解如何使用MyBatis和Spring Boot整合实现多数据源,并重点介绍一种方法——AOP(面向切面编程)法。这种方法允许我们在运行时动态地切换数据源。 首先,我们需要理解Spring Boot的自动配置特性。Spring...
在"springboot-03-web"项目中,我们可以看到Spring Boot的启动类,通常包含`@SpringBootApplication`注解,这是Spring Boot应用的入口,它集成了Spring的`@Configuration`、`@EnableAutoConfiguration`和`@...
总结,理解并熟练掌握Spring Boot中的配置文件,特别是`yml`的语法和`@ConfigurationProperties`注解的使用,对于高效开发和管理Spring Boot应用至关重要。同时,合理组织和利用配置文件,可以有效地提高项目的可...
在Spring Boot 2中,我们首先会接触到其核心概念——起步依赖(Starter Dependencies)。这些依赖简化了Maven或Gradle项目的配置,只需要引入相应的starter,如`spring-boot-starter-web`,就能自动包含Spring Web ...
本文将深入探讨Spring框架中的一个重要组件——注册(Registration),以及它与Spring_2900_Registration_7相关的知识。 首先,我们要明白Spring框架的核心理念是依赖注入(Dependency Injection,简称DI)。通过DI...
9. **Spring Boot的@ConfigurationProperties**:在Spring Boot中,Java Config还可以与`@ConfigurationProperties`结合,自动绑定YAML或properties文件中的配置到Java对象。 总结,Java Config是Spring框架的一大...
本项目——"spring-boot-easy-connection-pool-master",主要探讨了如何在Spring Boot环境下配置和管理连接池,并且实现了动态配置多数据源的功能,这对于大数据部门和数据中台服务尤其重要。 首先,让我们深入理解...
接下来,我们创建一个简单的Spring Boot应用——`HelloController.java`,并通过`@RequestMapping`注解来实现HTTP请求映射。 ```java @RestController public class HelloController { @RequestMapping(value={"/...
总结,本文详细介绍了Spring Boot项目中多数据源配置的实现,YAML配置文件的读取,以及如何在系统内部发起HTTP请求到其他系统。这些都是构建可扩展、灵活的企业级应用不可或缺的技术要点。理解和掌握这些知识点将有...
首先,我们看到目录结构中包含“springbootcr443”,这可能是项目的核心模块,暗示了项目是基于Spring Boot 2.4.x(因为“cr443”可能代表Spring Boot 2.4.3)版本构建的。Spring Boot的每个主要版本都有其特性改进...
《SpringBoot底层机制详解——基于zzw-springboot项目》 SpringBoot作为现代Java开发的热门框架,极大地简化了Spring应用的初始化和配置过程。它以其便捷性、灵活性和高效性,深受开发者喜爱。本文将深入探讨...
其中,“application.yml”是Spring Boot框架中常见的配置文件格式,它用于定义应用程序的各种属性,以实现灵活的配置管理。 描述中提到的“Java常用配置文件(application.yml)”是指在Java项目中,尤其是使用...
在Java项目中,我们可以使用Spring Boot的@ConfigurationProperties注解,将配置中心的属性映射到Java对象上,实现自动配置。"config-client-sample-main"可能包含了配置客户端的主启动类,通过@EnableConfigClient...
通过以上步骤,你就创建了一个简单的自定义 Starter —— `spring-boot-starter-helloworld`。这个 Starter 实现的功能是提供一个 `HelloworldService`,该服务有一个 `sayHello()` 方法,可以根据配置文件中的 `...