【Spring Boot】入门
一、Spring Boot简介
spring boot是一个主要用来简化spring应用开发的框架,核心思想:约定大于配置。
spring boot推荐使用全注解的方式来进行开发。
接触过spring框架开发的,对于学习spring boot就会得心应手了,十分方便。
spring boot --> J2EE一站式解决方案
spring cloud --> 分布式整体解决方案
spring boot优点
- 快速创建独立运行的spring项目以及主流框架集成。比如有内嵌Tomcat简化服务器部署条件,与mybatis快速方便集成等
- 无需配置XML,无代码生成,开箱即用。
- starter自动依赖与版本控制
二、使用maven创建一个hello world入门程序
环境准备:jdk1.8、maven3、idea
前提:自行百度解决idea整合好jdk1.8和maven3
spring官网其实有给spring boot入门帮助文档的:https://spring.io/guides/gs/spring-boot/
- pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhbit.xiaojiang.HelloWorld</groupId>
<artifactId>HelloWorld</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- spring boot 主程序启动文件
@SpringBootApplication注解:标明这是一个主程序类,说明这是一个spring应用
/**
* FileName: HelloWorld
* Author: 小江
* Date: 2019/10/19 9:29
* History:
*/
package com.zhbit.xiaojiang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloWorld {
//spring应用启动起来
public static void main(String[] args) {
SpringApplication.run(HelloWorld.class,args);
}
}
- hello world程序相关逻辑代码
@Controller注解:标明这是一个控制类
@RequestMapping注解:接受浏览器的请求并返回跳转路径
@ResponseBody注解:指明方法返回的是json字符串或对象,从而避免方法返回值解析为跳转路径
/**
* FileName: HelloController
* Author: 小江
* Date: 2019/10/19 9:32
* History:
*/
package com.zhbit.xiaojiang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/Hello")
public String Hello(){
return "Hello World!";
}
}
图片.png
启动完成后在浏览器输入localhost:8080/Hello
即可访问hello world程序了。
另外,在上面简介中提到spring boot有个优点:简化服务器部署条件,意思是不需要服务器有Tomcat环境,spring boot应用打包成jar包即可运行,因为打包的时候把内嵌Tomcat也打包进去了。
图片.png 于是我们把idea里的hello world停掉,经过上面3步骤打包出jar包,然后直接切换到所在目录运行java -jar jar包名
即可运行spring boot程序了,照样浏览器输入localhost:8080/Hello
,仍可访问。
图片.png
若把cmd命令行窗口关掉就意味着tomcat也关掉了。
三、spring boot启动器
spring-boot-starter
就是启动器,有各种场景,按需导入。比如当我们要开发web项目的时候就得在pom.xml文件里配置spring-boot-starter-web模块,这模块里面包含了使一个web程序正常运行的所有组件。
四、YAML配置文件
spring boot时常采用以下2种全局配置文件
//这种是application.properties文件
server.port=8081
//这种是application.yml文件,区别于XML配置文件,没有太多的开闭标签,是以数据为中心的配置文件
server:
port: 8081
YAML的语法
写yaml配置文件最需要注意的是键值对(k: v)之间的空格千万不能忘记加,还有大小写敏感。
关于yaml配置文件值的写法,有3种类型
1、字面量,即数值、字符串、布尔值
注意:字符串默认是不加单引号或者双引号的,如果加上了的话,单引号和双引号出来的效果又会不一样,双引号对特殊字符是会转义的,而单引号不会转义。
举例:
age: "15 \n 22" 则输出:15 换行 22
age: '15 \n 22' 则输出:15 \n 22
2、对象、Map,即属性和值,注意缩进和:空格
friends: //对象
name: xiaojiang //属性和值
age: 22
friends: {name: xiaojiang,age: 22} //与上面同义,是行内写法
3、数组,即List、Set
animals: //数组
- pig //- 值 表示数组内的一个元素
- cat
- dog
animals: [pig,cat,dog] //与上面同义,是行内写法
五、初试yaml和properties配置文件
application.yml
server:
port: 8081
person:
name: xiaojiang
age: 22
boss: false
birth: 2019/10/19
maps: {k1: v1,k2: v2}
lists:
- worker
- student
dog:
name: 小狗
age: 2
application.properties
server.port=8081
person.name=小江
person.age=22
person.boss=false
person.birth=2019/10/19
person.maps.k1=v1
person.maps.k2=v2
person.lists=worker,student
person.dog.name=小狗
person.dog.age=2
上面的配置文件是等同的(二者选一)配置属性的值,下面的是bean的属性,通过@ConfigurationProperties注解把配置文件与bean属性绑定起来,记得要使用@Component注解,把bean组件加到spring容器中,才能使用这个@ConfigurationProperties注解的功能。
/**
* FileName: Person
* Author: 小江
* Date: 2019/10/19 21:51
* History:
*/
package com.zhbit.xiaojiang.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;
/**
*@Author 小江 [com.zhbit]
*@Date 2019/10/19 18:49
*Description:将配置文件中配置的属性的值都映射到这个bean组件中
* @ConfigurationProperties注解:告诉springboot这个bean组件中所有属性和配置文件中相关的配置进行绑定
* prefix="Person"表示配置文件中的person的所有值与下面所有属性一一映射
* @Component注解:把bean加入Spring容器中
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
'}';
}
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;
}
public Boolean getBoss() {
return boss;
}
public void setBoss(Boolean boss) {
this.boss = boss;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
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;
}
}
注解场景区别.png
当然,这些配置都是在全局配置文件里的,但是如果都把一些与spring框架无关的业务配置在全局配置文件中的话,全局配置文件就太冗杂了,于是可以拆分出来,业务属性的注入可以使用@Value在代码中注入,也可以单独抽出来一个非全局配置文件,然后通过@PropertySource注解加载指定的配置文件,如下:
@PropertySource(value = {"classpath:person.properties"})
六、切换多场景的配置文件
我们的项目在不同的场景可能会有不同的配置,比如在开发环境下,在生产环境下,在测试环境下,都会有不同的配置信息(比如端口号)要改,我们可以写不同份.properties配置文件,然后想用哪一份就激活那一份即可。
使用.yml配置文件的话就更方便些,不用写多份配置文件,因为.yml配置文件支持多文档块形式,类似于如下这样:
server:
port: 8081
spring:
profiles: dev
--- //这就是用来划分文档块的分隔符
server:
port: 8082
spring:
profiles: test
--- //这就是用来划分文档块的分隔符
server:
port: 8083
spring:
profiles: prod
激活指定哪份配置,有3种方式
1、默认是选择第一块配置信息,比如要激活指定切换到生产环境的配置文件,就如下配置
server:
port: 8081
spring:
profiles: dev
active: prod //激活上面生产环境的配置块
2、使用命令行参数的方式激活配置块
图片.png
3、使用虚拟机参数的方式激活配置块
图片.png
七、配置文件优先级
关于springboot配置文件的加载顺序,主要体现在项目的运维这一领域,比如当我们打包好了项目的jar包,但有时需要修改下端口号等配置但又不想改动项目代码重新打包,我们可以在外部写一个配置文件,然后和jar包放在同路径下就可以加载到外部的配置信息了。
优先级:
项目内的话,先是加载项目根目录下的config目录下的配置文件-->再是加载项目根目录下的配置文件-->然后是项目根目录下的resource目录下的config目录下的配置文件-->最后才是项目根目录下的resource目录下的配置文件。
项目外的话,优先级更高,有通过把配置文件放在和jar包同路径下的,有通过命令行参数的方式启动jar包带上配置参数的,有通过代码里使用@PropertySource注解加载指定的外部配置文件的。
总结:不管是项目内还是项目外,所有配置文件都会被加载到,配置文件加载都遵循相同配置优先级高的覆盖优先级低的,不同配置则直接互补。