开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情
SpringBoot学习
学习目标
- 掌握SpringBoot开发流程
- 掌握java配置代替xml配置,常用注解作用
- 能够使用SpringBoot整合常用框架
- 能够完成当天整合案例
- 理解SpringBoot自动配置流程
统一开发环境
运行环境:
- 开发工具:Idea
- JDK版本:1.8
- mysql版本:5.6或5.7
1. 认识SpringBoot
在这一部分,我们主要完成下述目标:
- 什么是SpringBoot
- 为什么要学习SpringBoot
- SpringBoot的特点
- 快速入门
1.1.什么是SpringBoot
SpringBoot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品:
我们可以看到下面的一段介绍:
Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention over configuration and is designed to get you up and running as quickly as possible.
翻译一下:
用一些固定的方式来构建生产级别的spring应用。Spring Boot 推崇约定大于配置的方式以便于你能够尽可能快速的启动并运行程序。
其实人们把Spring Boot 称为**搭建程序的脚手架**。
其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。让开发java项目更加快捷、简单!
1.2.为什么使用SpringBoot
-
复杂的配置
项目各种配置其实是开发时的损耗, 因为在思考 Spring 特性配置和解决业务问题之间需要进行思维切换,所以写配置挤占了写应用程序逻辑的时间。
-
“混乱”的依赖管理
项目的依赖管理也是件吃力不讨好的事情。决定项目里要用哪些库就已经够让人头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这难题实在太棘手。并且,依赖管理也是一种损耗,添加依赖不是写应用程序代码。一旦选错了依赖的版本,随之而来的不兼容问题毫无疑问会是生产力杀手。
掌握了SpringBoot以后,我开发快捷,高效!
那么,为什么SpringBoot有这么大的魔力呢?
Spring Boot 简化了基于Spring的应用开发,只需要“run”就能创建一个独立的、生产级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置(提供默认设置,存放默认配置的包就是starter),这样我们就可以简单的开始。多数Spring Boot应用只需要很少的Spring配置。
我们可以使用SpringBoot创建java应用,并使用java –jar 启动它,就能得到一个生产级别的web工程。
从此我们开发web项目也无需打war了!
1.3.SpringBoot快速入门
接下来,我们就来利用SpringBoot搭建一个web工程,体会一下SpringBoot的魅力所在!
1.3.1.创建工程
选择 new Project:
使用Spring的初始化模板搭建项目:不需要再选择maven创建工程了!
此种方式注意: 网络要求很高! 网络不好不建议此种创建方式!
填写maven坐标信息:
选择所需的起步依赖: 目前最新版本:3.0.2 可以先选择,后续我们再切换成2.3.0版本
选择项目的存储位置:
如果网络不畅或者不好的情况 建议手动搭建项目工程: maven工程即可 pom导入
默认 版本 2.3.4 可以先选择 配置文件里面修改成:2.3.0
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
1.3.2.编写controller
编写一个controller,提供一个可以访问的接口:
代码如下: 注意controller 位置 必须在启动类的包所在的路径或者更短路径
@RestController // 该注解 = @Controller+@ResponseBody 结合体
public class HelloController {
@GetMapping("hello")
public String hello(){
return "你好 程序员们";
}
}
启动访问
1.3.3.SpringBoot启动项目
启动方式一: 直接main方法启动
最简单的启动方式,就是在项目中,找到main函数,直接运行即可:
@SpringBootApplication
public class QuickstartApplication {
public static void main(String[] args) {
SpringApplication.run(QuickstartApplication.class, args);
}
}
启动日志: 有些同学 端口8080 如果被占用 ,启动会失败,因为sp启动默认端口 8080!
可以看到tomcat启动了,监听了8080端口。在页面访问:http://localhost:8080/hello即可
如果出现端口冲突 可以修改默认端口号:resouces目录下的 application.properties 再次启动即可
server.port=8010
我们在浏览器直接输入地址: localhost:8010/hello即可
启动方式二:使用plugins插件启动
第二种方式:idea 工具
双击: spring-boot:run
可以看到tomcat启动了,监听了8080端口。在页面访问:http://localhost:8080/hello即可
启动方式三:通过java -jar 启动
第三种方式,也就是将来打包发布时运行的方式。
此种方式: springboot插件 起到关键作用:先: package 打包 再 执行 java -jar xxx.jar 命令
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
后续生产环境最常用的一种方式,一般开发中很少出现将工程打成:war!!
首先要对项目进行打包,需要进入项目根目录,执行maven命令: 然后我们发现在target目录下会生成项目jar包
mvn clean package
不过,在输入命令前,我们可以在项目的pom文件中添加一个properties属性,打包时跳过单元测试:
<skipTests>true</skipTests>
如图:
运行后结果:
然后进入项目目录下的target目录,可以看到一个打包好的jar包:
输入命令,运行jar包: java -jar
java -jar demo-0.0.1-SNAPSHOT.jar
1.4.SpringBoot做了什么?
可以看到我们利用SpringBoot搭建好工程,即可直接编写controller,开始专注业务开发,省去了所有的配置、依赖管理,非常简单!
那么这些省去的配置、依赖SpringBoot是什么时候帮我们完成的呢?
1.4.1.SpringBoot依赖管理
首先来看SpringBoot如何帮我们管理依赖及其版本信息。
打开项目的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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lucky</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这里包含了4部分内容,分别是:
- 父工程配置
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
- Properties配置
<properties>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
</properties>
- 依赖启动器 - sp通过不同的启动器依赖 完成相关的所有依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 插件 : sp需要的打包插件
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
1)父工程配置
这个项目有一个父工程配置:
可以看到使用的SpringBoot版本是最新的2.1.6RELEASE 版本。跟入这个pom查看,发现又继承了另一个父工程:
继续跟入,发现里面已经管理了各种依赖及其版本了,列举一部分大家看:
因此,我们的项目需要引入依赖时,只需要指定坐标,版本都有SpringBoot管理,避免了依赖间的冲突。
2)Properties:
properties中主要定义了项目的JDK版本:
3)依赖项:
这里我们总共引入了3个依赖启动项:
看看项目中实际引入了哪些jar包:当我们引入了相关的starter ,springboot 会自动将相关依赖自动导入
当我们移除两个spring-boot-starter命名的依赖项时,可以发现所有的jar都消失了:
也就是说,在下面的这个依赖项(starter)中:
<!--web工程起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
定义好了一个web工程所需的所有依赖,当我们引入依赖时,无需像以前那样一个一个寻找需要的依赖坐标并且验证版本是否冲突,开发时只需要引入这个starter即可!
4)插件:
最后是一个插件: commons pom
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
这个是SpringBoot工程在打包时用到的插件,后续打包,springboot会根据此插件,进行应用程序打包!
切记不可以缺少!
上述插件:所在的模块 一定是一个独立应用程序 + (启动类 main方法!)
5)总结:
因为SpringBoot对于依赖的管理,我们搭建项目时只需要引入相关的starter,无需再依赖引入上话费更多时间,大大提高了开发效率!
1.4.2.SpringBoot去xml配置
在以前,我们搭建一个web工程,至少需要下列配置文件:
- tomcat配置:web.xml(包括spring监听器、SpringMVC的DispatcherServlet、各种过滤器)
- SpringMVC配置:springmvc.xml(包括注解驱动、视图解析器等)
- Spring配置:applicationContext.xml(包括数据源、Bean扫描、事务等)
- mybatis配置:mybatis-config.xml全局配置,mybatis与spring整合配置、mapper映射文件配置
完成所有配置需要花费大量时间,每天都淹没在xml的海洋中,整个人生都陷入了被xml支配的恐惧、黑暗当中。直到有一天,SpringBoot如同一页方舟,将你从xml海洋中拯救出来。
事实上,在Spring3.0开始,Spring官方就已经开始推荐使用java配置来代替传统的xml配置了,我们不妨来回顾一下Spring的历史:
-
Spring1.0时代
在此时因为jdk1.5刚刚出来,注解开发并未盛行,因此一切Spring配置都是xml格式,想象一下所有的bean都用xml配置,细思极恐啊,心疼那个时候的程序员2秒
-
Spring2.0时代
Spring引入了注解开发,但是因为并不完善,因此并未完全替代xml,此时的程序员往往是把xml与注解进行结合,貌似我们之前都是这种方式。
-
Spring3.0及以后
3.0以后Spring的注解已经非常完善了,因此Spring推荐大家使用完全的java配置来代替以前的xml,不过似乎在国内并未推广盛行。然后当SpringBoot来临,人们才慢慢认识到java配置的优雅。
在SpringBoot中,就用Java代码配置代替了以前繁杂的xml配置,而且这些配置都已经放到了SpringBoot提供的jar包中,因此我们引入starter依赖的那一刻,这些配置都已经生效了!
这就是springBoot的自动配置功能。