Spring Boot学习(三): 配置文件详解以及一些注解

这里是一个学习过程笔记的汇总:Spring Boot学习汇总


首先通过开发工具快速创建一个spring boot项目,结构如下(我把用不上的文件删掉了):

这个快速创建的项目可以直接启动运行,那要配置文件有什么用呢?

springboot快速创建的项目,都会有一个默认的参数配置,比如说默认配置的端口号是8080,要修改这个端口号的话,就用到了配置文件。所以,配置文件很大的一个作用时修改默认的参数配置。

1、格式:

        可以看到resources文件夹下有一个application.properties文件,这个就是默认的springboot全局配置文件,这是propertires文件,格式为:key=value

如下:

server.port=8090

还有一种是yaml文件,具体语法请看官方详解:YAML语言详解

格式为: key:(空格) value      此处注意,value和冒号之间要有一个空格

server:
  port: 8091

如果在一个springboot项目中同时配置application.properties和application.yml文件,那么会优先匹配application.properties文件的值。

2、从yml配置文件中获取值

创建两个实体类,Person,以及宠物类 Dog

代码:

package com.xxx.demo.domain;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author pavel
 * @date 2018/11/7
 */

/**
 * @ConfigurationProperties 注解告诉springboot将本类中的属性与配置文件中的配置进行一一绑定
 *  prefix = "person": 告诉springboot应该和配置文件中的哪块配置进行绑定,此处说明是和person下面的配置进行绑定
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;
    private Integer age;
    private Date birthday;
    private Boolean married;
    private Map<String, Object> map;
    private List<Object> list;
    private Dog dog;

    // get,set,toString方法省略
}
​
package com.xxx.demo.domain;

/**
 * @author pavel
 * @date 2018/11/7
 */
public class Dog {

    private String name;
    private Integer age;
    
    // get,set,toString方法省略
}

​

写上面这个Person类时,添加@ConfigurationProperties时,编辑器上方回出现一个提醒,如下:

这是说注解的处理器在classpath中没有找到,我们点进去后面的Open Documentation,进到官方文档看看 :

文档大概是说, 加上这个配置文件处理器依赖之后,在你使用@ConfigurationProperties注解时,会帮我们生成一些配置文件的元数据信息,

最直接的就是导了这个包之后,我们在配置yml文件时,会有相应的提示。

下面来配置yml文件, 

server:
  port: 8091

person:
  name: David
  age: 23
  birthday: 2018/11/07   # 注意,实体类的birthday是Date类型,yml要用/ 来隔开年月日,用- 的话(2018-11-07)会报错
  married: false
  map:
    k1: v1
    k2: v2
#  map: {k1: v1, k2: v2}  这样写也一样效果

  list:
    - v1
    - v2
#  list: {v1, v2}  这样写效果也是一样
  dog: {name: 汪汪, age: 1}

properties文件则是这样:

server.port=8092

# 配置person的值
person.name=王五  # 如果属性名是驼峰的,如 cityName,  则写成person.city-name=杭州也是可以的
person.age=12
person.birthday=2006/10/02  # 注意,实体类的birthday是Date类型,yml要用/ 来隔开年月日,用- 的话 
                            # (2018-11-07)会报错
person.married=false
person.list=a1,a2,a3
person.map.k1=v1
person.map.k2=v2
person.dog.name=汪汪
person.dog.age=1

加上上面那个依赖后,properties文件可以看到有代码提示:

获取值除了@ConfigurationProperties注解批量注入之外,还可以使用@Value注解一个个获取值,如下:

即在属性上面使用Spring的@Value注解,${}表达式取出配置文件的相关值,Spring表达式#{}可以直接计算值。

那么什么时候用@Value,什么时候用@ConfigurationProperties呢?

        如果某个业务场景需要用到配置文件中的某项值,则用@Value,

        如果我们特地写了一个javeBean来和配置文件进行映射,就用@ConfigurationProperties。

3、测试

利用开发工具快速创建的spring boot项目会带有一个测试类,如下

这个测试类,可以直接像代码中那样,注入一切我们想注入的方法,类...

package com.xxx.demo;

import com.ejlchina.demo.domain.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    private Person person;

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

测试类中我们直接将Person类注入,然后输出结果,看控制台是否输出Person类的信息,如果输出,则说明配置文件中配置的数据映射到了实体类中。如下:

yml配置文件:

properties配置文件:

可以看到一个区别,yml正常,但properties文件配置的中文参数,映射过来是乱码,这是为嘛?

原来,idea默认使用的是utf-8编码,而properties文件使用的是ascii码,所以需要进行一个设置,如下

如此,就好了, 没有乱码了。

4、@ConfigurationProperties和@Value获取值方式的对比

最后一条复杂类型封装是指:List,Map等等格式的数据

这里提一下JSP303数据校验,格式如下:

在实体类上添加注解@Validated,此处我在name属性上添加@Email注解,给name属性增加邮箱格式的校验,如果配置文件中name属性的值不为邮箱格式,则会报错,如下:

错误信息如下:

   - Field error in object 'person' on field 'name': rejected value [David];
 codes [Email.person.name,Email.name,Email.java.lang.String,Email]; 
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: 
codes [person.name,name]; arguments []; default message [name],[Ljavax.validation.constraints.Pattern$Flag;@704b2127,
org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@3ee39da0]; default message
 [不是一个合法的电子邮件地址]; origin class path resource [application.yml]:5:9

我们将name属性值改成邮箱格式,再测试,

输出信息:

更多的校验规则可以参考这篇文章: JSR303数据校验

5、相关注解。

@ProperSource,上面讲到的@ConfigurationProperties注解时默认加载全局配置文件,那么我们要想加载一个其他的配置文件,就可以用到@ProperSource(value = {"classpath:person.properties"}),这中写法是从类路径下加载person.properties文件。

@ImportResource,  Spring Boot里面没有Spring的配置文件,我们自己编写的,SpringBoot并不能自动识别,所以就要用到这个注解,让我们自己写的配置文件的内容生效。 标注在主启动类上即可。如下:

@Bean,这个注解,可以直接某个组件注入到Spring容器,使用如下:

package com.xxx.demo.domain.config;

import com.xxx.demo.domain.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Configuration 注解说明当前类是一个配置类
 */
@Configuration
public class MyConfig {
     // 将方法的返回值添加到Spring容器中,容器中的这个组件默认的id就是方法名
    @Bean
    public HelloService helloService () {
        System.out.println("使用@Bean注解给容器添加组件...");
        return new HelloService();
    }
}

测试看有没有添加到容器中:

看到控制台打印的是true,说明该方法已经添加到容器中。以上直接在HelloService类上添加一个@Service功能一样,这里只是为了说明@Bean的功能。

好了,今天就到此结束,明天继续。

发布了34 篇原创文章 · 获赞 43 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/pavel101/article/details/83823564
今日推荐