简介:
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need very little Spring configuration.
Spring Boot可以轻松创建独立的,生产级的基于Spring的应用程序,您可以“直接运行”。 我们对Spring平台和第三方库有所了解,因此您可以从最小的麻烦开始。大多数Spring Boot应用程序只需要很少的Spring配置。
使用IDEA快速创建SpringBoot应用
高版本的IDEA提供SpringBoot应用快速创建的引导,相比于maven创建省去了查询依赖和创建包目录的麻烦。new -> Project... 选择Spring Initializr -> 修改Project MetaData -> 根据需要选择依赖 -> 项目起名、项目选址 -> 完成。目录结构如下图所示:
目录结构区别传统web项目,没有WebContent目录,只有resources。次级目录static放置静态资源如html、CSS、JavaScript等;templates放置动态资源,SpringBoot不建议使用JSP,建议使用Thymeleaf。Thymeleaf依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
application.properties 和 application.yml作为配置文件用来存放自定义的配置信息。
YAML语法
yaml以数据为中心区别于properties。
K:(空格)V 表示一对键值对,空格必须有。
层级关系适用空格的缩进表示。demo:
server:
port: 8086
path: /hello
字符串默认不使用引号,单双引号都有特殊作用。
name: "zhangsan /n lisi" name: zhangsan 换行 lisi
name: 'zhangsan /n lisi' name: zhangsan /n lisi
对象属性值的写法
friend:
name: zhangsan
age: 23
&行内写法:
friend: {name: zhangsan,age: 23}
数组
pets:
- cats
- pigs
- dogs
##行内写法:
pets: [cats,pigs,dogs]
yaml如何映射bean
实体组件:
package com.mlgg.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private boolean boss;
private Date date;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public boolean isBoss() {
return boss;
}
public void setBoss(boolean boss) {
this.boss = boss;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", boss=" + boss +
", date=" + date +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
}
狗:
package com.mlgg.bean;
public class Dog {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
yaml:
person:
name: zhangsan
age: 23
boss: false
date: 2019/7/8
maps: {g1: lol,g2: cf,g3: dnf}
lists: [zhangsan,lisi,wangwu]
dog:
name: 小狗
age: 2
SpringBoot测试类:
package com.mlgg.springboot;
import com.mlgg.bean.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 springbootTest {
@Autowired
Person person;
@Test
public void contextLoads(){
System.out.println(person);
}
}
结果:
Person{name='zhangsan', age=23, boss=false, date=Mon Jul 08 00:00:00 CST 2019, maps={g1=lol, g2=cf, g3=dnf}, lists=[zhangsan, lisi, wangwu], dog=Dog{name='小狗', age=2}}
properties赋值对象
我们将yaml的person配置注释掉,改用properties赋值:
person.name=张毅飞
person.age=23
person.boss=false
person.maps.g1=lol
person.maps.g2=cf
person.maps.g3=dnf
person.date=2019/7/8
person.lists=a,b,c
person.dog.name=dog
person.dog.age=2
其他代码不变,需要注意的是IDEA中properties文件默认使用ASCII编码,IDEA默认使用utf-8,所以会造成中文乱码问题,需要修改IDEA的配置:
@ConfigurationProperties(prefix = "person") 和Spring注解@Value的区别:
前者批量注入数值 后者单独指定;
前者支持松散语法 后者不支持;
前者不支持SpEL表达式 后者支持;
前者支持JSR303校验 后者不支持。
配置文件无论yml还是properties都可使用占位符,包括随机占位符${random.uuid}、${random.int} ... 和普通占位符
也可指定配置文件中的键来获取值如:person.dog.name=${person.name}_dog 那么person.dog.name对应 张毅飞_dog 。注意:如果取的值没有配置,那么会报错。当然我们可以给他赋值: person.dog.name=${person.name:zhangyifei}_dog 这种赋值方法甚至可以创建一个新的值比如从未定义过hello字段,我们可以这样定义: person.dog.name=${person.hello:hello}_dog。
加载指定配置文件
@ConfigurationProperties默认从全局配置文件中获取值,提取局部配置文件就需要用到另一个注解@PropertySource(value = {"classpath:person.properties","..."})用来加载指定的配置文件集。
在SpringBoot中不存在也不能识别Spring的配置文件,如何让我们手动编写的Spring配置文件生效就需要使用注解:@ImportResource 标在需要配置的类上。注解的value值和@PropertySource相似,可以读多个配置文件。
@ImportResource用来导入Spring的配置文件,让配置文件生效。
SpringBoot推荐使用全注解的方式向容器中添加组件。不推荐xml。
一个简单的Spring配置类:
package com.mlgg.config;
import com.mlgg.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAppConfig {
@Bean //将返回值添加到容器中,容器名默认使用方法名 , 即helloService
public HelloService helloService(){
return new HelloService();
}
}
Profile
Profile是Spring对不同环境配置的支持,可以通过激活、指定参数等方式快速切换,可以在生产、测试、开发环境中使用不同的配置。
可选配置文件的命名格式为:application-{profile}.properties
比如我们可以创建两种环境下的配置文件:application-product.properties 和 application-develop.properties 。
系统默认使用的配置文件是application.properties 我们需要在application.properties中添加一个键值对来确定使用哪种环境下的配置,如下选择开发环境:
spring.profile.active=develop
yml配置多环境
yml使用 “---”来将一个yml分成多个document块。我们可以在不同的document块中进行不同的配置。例子如下:
spring:
profile:
active:develop
---
server:
port:8083
spring:
profile:develop
---
server:
port:8086
spring:
profile:product
执行的端口为8083。
命令行激活配置:
命令行是运行时的配置。
也可以在运行jar的时候配置:
在jar的目录中启动命令行,输入命令: java -jar jar名 --spring.profile.active=develop指定为开发环境的配置。
虚拟机配置:
配置文件加载位置和优先级
以及互补配置,运维指定配置文件,这里省略。
添加debug=true让控制台打印debug信息。