SpringBoot中的@ConfigurationProperties

有什么用

该注解的作用类似于@Value,即为组件中的属性进行赋值。

怎么用

首先是建立一个springboot的工程,不再赘述。

首先我们建立一个Person类和一个Dog类。

package com.helius.springboot.bean;

@Component //加上它,即成为ioc容器中的一个组件
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    // 省略了setter、getter、toString()等
}

再来看SpringBoot的主配置文件application.properties

person.last-name=张三
person.age=18
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=perter
person.dog.age=15

在springboot的测试类中进行测试

/**
 * SpringBoot单元测试;
 *
 * 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
 *
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ConfigApplicationTests {

    @Autowired
    Person person;

    @Test
    public void contextLoads() {
        System.out.println(person);
    }

}

控制台打印一下结果

Person{lastName='张三', age=18, boss=false, birth=Fri Dec 15 00:00:00 CST 2017, maps={k1=v1, k2=14}, lists=[a, b, c], dog=Dog{name='perter', age=15}}

我们发现,容器中person组件已经全部被赋值了。


解释

因为我们使用了@ConfigurationProperties(prefix = "person")这个注解

将配置文件中配置的每一个属性的值,映射到这个组件中

[email protected]:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; prefix = "person":配置文件中哪个下面的所有属性进行一一映射==

相关注解

在之前的博文中:Spring中使用@Value和@PropertySource为属性赋值中介绍@Value注解,

它能够为组件注入外部配置文件中的值。

那在springboot中的,可以直接使用@Value注解,不需要导入主配置文件application.properties,毕竟它是主配置文件,也是放在springboot约定的位置的。

既然@Value和@ConfigurationProperties都能为组件赋值,那区别呢?

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散语法 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
  1. 松散语法:可以发现配置文件中我们使用person.last-name也能够为Person类中的lastName属性进行赋值。

其实你使用last-name还是last_name亦或lastName都能够为Pseron中对应的属性赋值,这叫松散绑定

  1. @Value支持Spel这个可以在之前的博文中看到 ,而 @ConfigurationProperties 是不支持的。
  2. 我们在springmvc中使用过@Validated这个注解。在@ConfigurationProperties也是支持的,使用示例放在最后面
  3. 最后一点,@Value不能够对复杂类型进行赋值,如private Map<String,Object> maps;该属性,就无法在属性加上

@Vavlue(${person.map})是拿不到值的。


@Validated应用举例

改造一下Person类。

package com.helius.springboot.bean;

@Component //加上它,即成为ioc容器中的一个组件
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
    @Email
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    // 省略了setter、getter、toString()等
}

这是在赋值的时候检查lastName必须是邮件格式,

重新运行测试方法

Field error in object 'person' on field 'lastName': rejected value [张三]; codes [Email.person.lastName,Email.lastName,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.lastName,lastName]; arguments []; default message [lastName],[Ljavax.validation.constraints.Pattern$Flag;@702ed190,org.springframework.valid[email protected]173b9122]; default message [不是一个合法的电子邮件地址]

原文地址:https://www.cnblogs.com/heliusKing/p/11487360.html

时间: 2024-07-31 12:05:51

SpringBoot中的@ConfigurationProperties的相关文章

springboot中读取自定义properties文件

一.在高版本的springboot中,@ConfigurationProperties(prefix = "wisely2",locations = "classpath:wisely.properties")这个注解不支持了,所以我们要另辟蹊径 二.使用组合式注解: 1.自定义config.properties文件: 1 config.fileServer=/root/jzyp/staticserver/webapps/ROOT/server 2 config.s

SpringBoot(五):@ConfigurationProperties配置参数绑定

在springmvc或其他ssh框架中如果我们要实现一个配置参数的加载,需要使用代码实现读取properties文件等操作,或者需要使用其他属性@value(name="username")等配置操作.但是在springboot中就比较简单操作: 1)自定义配置参数绑定:通过使用@ConfigurationProperties和@Component注解自定义参数配置类,之后程序启动时将自动加载application.properties配置文件中的对应的配置项: 2)第三方组件类的配置

springboot中的常用注解

springboot中的常用注解个人觉得springboor中常用的注解主要可以分为三种:放入容器型注解.从容器中取出型注解和功能型注解.其中的放入容器型和从容器中取出型就是我们平时所说的控制反转和依赖注入的概念(个人版本- - - 可以看一看,别太当真 0.0) 放入容器型注解简介:个人觉得就是申明一个实例对象,然后将这个对象交给spring管理. 1.@Component:放在类上,把普通类实例化到spring容器中.可以说很多注解都是基于这个注解的. 2.@Bean: 放在方法上,用@Be

SpringBoot 中从yml配置文件中读取常用的参数值

SpringBoot现在基本上都是使用application-XXX.yml(生产环境为pro,开发测试环境为dev)来配置项目中的一些配置条件,在springboot中还可以通过从yml文件中将yml中的数据直接读取出来. 1.yml文件(这里设置参数的时候往往设置两层前缀,避免在调用的时候该属性中的部分参数名与计算机中的某些名字冲突) test: person: lastName: hello age: 18 boss: false birth: 2017/12/12 maps: {k1:

SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml配置文件.我现在使用的是spring boot ,没有了xml文件配置就方便多了.我同样尝试了两种方式,也都是简单的查询,需要更复杂的查询,还需要我研究研究.往下看,需要先配置springboot的开发环境,需要大致了解springboot,这里可以看下面两篇文章: springboot 项目新建 springboot

Springboot中使用缓存

在开发中,如果相同的查询条件去频繁查询数据库, 是不是会给数据库带来很大的压力呢?因此,我们需要对查询出来的数据进行缓存,这样客户端只需要从数据库查询一次数据,然后会放入缓存中,以后再次查询时可以从缓存中读取.Spring3开始提供了强大的基于注解的缓存支持,可以通过注解配置方式低侵入的给原有Spring应用增加缓存功能,提高数据访问性能. 具体在Springboot中使用缓存如下: 1.在pom.xml中引入cache依赖,添加如下内容: <dependency> <groupId&g

如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧

做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot项目后,却发现JSP和view关联有些麻烦,因为官方不推荐JSP在Spring Boot中使用.在我看来,继续用这种繁杂的手续支持JSP仅仅只是为了简单兼容而已. 我们先来看看如何在SpringBoot中使用JSP ? 1. 在pom.xm中加入支持JSP的依赖 <dependency> <

Spring-Boot中Tomcat端口修改

Spring-Boot中Tomcat端口默认为8080,那么我们该如何来修改呢? 工具:eclipse ①打开eclipse,点击工具栏中的Run: ②选择Configurations(任选一个): ③进入修改页面,按下图进行设置(在VM arguments处填写-Dserver.port=**(**为你要启动的端口)) ④这样就修改成功啦,启动看看吧(不行就重启一下eclipse试试) 更多方法请参考: http://stackoverflow.com/questions/21083170/s

springboot中数据库配置加密

在springboot中,配置数据库等信息时,用户名和密码明文显示会大大降低安全性,在此介绍一种加密方式,简单易用. 添加依赖: <dependency>    <groupId>com.github.ulisesbocchio</groupId>    <artifactId>jasypt-spring-boot-starter</artifactId>    <version>1.8</version> </de