这里是一个学习过程笔记的汇总: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的功能。
好了,今天就到此结束,明天继续。