第一章:Spring Boot2简介
1、学习要求
- 熟悉Spring基础
- 熟悉Maven使用
2、环境要求
Java8及以上
Maven 3.5及以上
参考网址:docs.spring.io/spring-boot…
官方说法:Spring Boot 2.6.4 requires Java 8 and is compatible up to and including Java 17. Spring Framework 5.3.16 or above is also required.
Explicit build support is provided for the following build tools:
Build Tool | Version |
---|---|
Maven | 3.5+ |
Gradle | 6.8.x, 6.9.x, and 7.x |
3、Spring与SpringBoot
3.1、Spring能做什么
做Java和java-web开发的人一提起Spring,首先在脑海中浮现出的就是“IOC”,“AOP”,“Spring MVC”,“Spring Security”等等这些名词,甚至大有“无Spring不Java”的感慨。实际上,时至今日Spring已不再是一个简单的编程框架了,从最初的“SSH框架”发展到今天,Struts和Hibernate都几乎快要从程序员视野中消失了,而Spring却发展成了一个非常庞大且完整的生态。
所以说,除非特别指明是Spring生态中的某个具体框架,否则提起“Spring”应该指的是整个Spring生态。说句不夸张的话, Java程序员只要精通了Spring,也就掌握了Java开发的精髓。
在整个Spring生态中包含了许多应用在特定场景的具体框架,如:“Spring Framework”,“Spring Security”,“Spring Boot”,“Spring Cloud”等等,其中“Spring Framework”框架是整个生态的核心基础,其他框架都需要依赖“Spring Framework”提供的基础功能等,而且每个框架都有自己独立的代码仓库。
我们查看Spring官网spring.io/,Spring可以实现… 分别是微服务、响应式编程、云服务、 web应用、无服务、事件驱动、批处理。
3.2、Spring的生态圈
Spring生态下的项目分为3类:主要项目(Main Projects),社区项目(Community Projects),已经终止但是目前还保留的项目(Projects in the Attic)。覆盖了:web开发、数据访问、安全控制、分布式、消息服务、移动开发、批处理、......
最新的Spring生态项目列表详见:spring.io/projects
Springboot项目参考网址: spring.io/projects/sp…
3.3、为什么用SpringBoot?
官网:Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
即能快速创建出生产级别的Spring应用
我们再用通俗的话说一下:如果我们完全用Spring生态去开发一个高级项目,首先在数据访问层面,我们要学习SpringDate里面的一些知识,要做相应的配置,其次还要学习和配置其他的Spring生态里的东西,才能完成整个项目的开发,因此在使用这种传统的Spring去开发时,就算是一个简单的Java EE(Java Enterprise Edition)开发,也有大量的 XML 文件存在于项目之中,导致JavaEE项目变得慢慢笨重起来,繁琐的配置和整合第三方框架的配置,导致了开发和部署效率的降低,更不要说更高级的项目了。
那怎样可以简化这种方式逃离这种配置地狱形式的开发的呢? SpringBoot出现了
Spring Boot 并不是用来替代 Spring 的解决方案,而是和 Spring 生态中众多框架紧密结合用于提升 Spring 开发者体验的工具。同时它集成了大量常用的第三方库配置,Spring Boot应用中这些第三方库几乎可以是零配置的开箱即用(out-of-the-box),大部分的Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置),开发者能够更加专注于业务逻辑。
使用SpringBoot的最大好处就是简化配置,它实现了自动化配置。
3.4、Spring5的重大升级
1、Spring5的升级,SpringBoot也升级到了版本2,引入响应式编程Reactor
2、内部源码设计:基于Java8的一些新特性,如:接口的默认方法实现。重新设计源码架构。解决Spring的适配器模式的一些问题
3.5、SpringBoot优点
- Create stand-alone Spring applications:创建独立Spring应用
- Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files):直接嵌入Tomcat、Jetty或Undertow(无需部署WAR文件)
- Provide opinionated 'starter' dependencies to simplify your build configuration:自动starter(启动器)依赖,简化构建配置,能够控制jar包的依赖,只需要导入starter场景,其他的依赖自动导入,比如只需要导入web的starter,则其他的web依赖配置全部都自动导入,还能够控制版本的协调
- Automatically configure Spring and 3rd party libraries whenever possible:尽可能自动配置Spring和第三方库
- Provide production-ready features such as metrics, health checks, and externalized configuration:提供生产级别的监控、健康检查及外部化配置
- Absolutely no code generation and no requirement for XML configuration:绝对没有代码生成,也不需要XML配置
总结:
- SpringBoot是整合Spring技术栈的一站式框架
- SpringBoot是简化Spring技术栈的快速开发脚手架
3.6、SpringBoot缺点
- 人称版本帝,迭代快,需要时刻关注变化
- 封装太深,内部原理复杂,不容易精通,底层原理是Spring框架
4、时代背景
4.1、微服务
James Lewis and Martin Fowler (2014) 提出微服务完整概念。martinfowler.com/microservic…
In short, the microservice architectural style is an approach to developing a single application as a suite of small services , each running in its own process and communicating with **lightweight mechanisms, often an **HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.-- James Lewis and Martin Fowler (2014)
翻译总结:
- 微服务是一种架构风格,参考SpringCloud
- 一个应用拆分为一组小型服务
- 每个服务运行在自己的进程内,也就是可独立部署和升级
- 服务之间使用轻量级HTTP交互
- 服务围绕业务功能拆分
- 可以由全自动部署机制独立部署
- 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术
- 微服务的兴起就必须谈到分布式系统的应用
过去的单体应用架构
所谓单体应用架构(all in one)是值,我们将一个应用中的所有应用服务都封装在一个应用中,无论是ERP、CRM或者是其他什么系统,你都把数据库访问,web访问…等等各个功能放到一个war包内
单体应用的好处是易于开发和测试,也十分方便部署,当需要拓展时,只需要将war包复制多份,然后放到多个服务器上,再做个负载均衡就可以了
单体应用的缺点是如果修改一个非常小的地方,我们都需要停掉整个服务,重新打包、部署这个应用war包,特别是对于一个大型应用,我们不可能把所有内容都放在一个应用里面,我们如何维护、如何分工合作都是问题
微服务架构
所谓微服务架构就是打破之前all in one
的架构方式,把每个功能元素独立出来,把独立出来的功能元素的动态组合,需要的功能元素才去拿来组合,需要多一些功能元素时可以整合多个功能元素,所以微服务架构是对功能元素进行复制,而没有对整个应用进行复制
微服务架构的好处是节省了调用资源,每个功能元素的服务都是一个可替换的、可独立升级的软件代码
如何构建微服务
一个大型系统的微服务架构,就像一个复杂交织的神经网络,每一个神经元就是一个功能元素,它们各自完成自己的功能,然后通过http相互请求调用。比如一个电商系统,查缓存、连数据库、浏览页面、结账、支付等服务都是一个个独立的功能服务,都被微服务化了,它们作为一个个微服务共同构建了一个庞大的系统,如果修改其中的一个功能,只需要更新升级其中一个功能服务单元即可。
但是这种庞大的系统架构给部署和运维带来很大的难度,于是,spring为我们带来了构建大型分布式微服务的全套、全程产品:
- 构建一个个功能独立的微服务应用单元,可以使用springboot,可以帮助我们快速构建一个应用
- 大型分布式网络服务的调用,这部分由springcloud来完成,实现分布式
- 在分布式中间,进行流式数据计算、批处理,我们有spring cloud data flow
- spring为我们想清楚了整个从开始构建应用到大型分布式应用全流程方案
4.2、分布式
4.2.1、分布式的困难
这些全部都在SpringCloud详解
- 远程调用
- 服务发现
- 负载均衡
- 服务容错
- 配置管理
- 服务监控
- 链路追踪
- 日志管理
- 任务调度
- ......
4.2.2、分布式的解决
SpringBoot + SpringCloud
4.3、云原生
原生应用如何上云: Cloud Native
4.3.1、上云的困难
- 服务自愈
- 弹性伸缩
- 服务隔离
- 自动化部署
- 灰度发布
- 流量治理
- ......
4.3.2、上云的解决
5、如何学习SpringBoot
5.1、Spring Boot Reference Documentation
- 参考:docs.spring.io/spring-boot…
- Spring Boot 2.5.3 API:docs.spring.io/spring-boot…
- 查看发布的日志版本:spring.io/projects/sp…
- 查看版本新特性;github.com/spring-proj…
6、总结
Spring Boo是一个轻量级应用框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
特征:
1、可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs。 2、内嵌Tomcat或Jetty等Servlet容器。
3、提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置。
4、自动配置Spring容器,不需要XML配置
第二章:Spring Boot2入门
官方地址:docs.spring.io/spring-boot…
1、maven设置【setting.xml全局配置文件进行配置】
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
这样的话就不用单独在工程的pom文件进行修改了,一劳永逸,最好复制一份原setting.xml文件
2、创建HelloWorld-Maven项目
需求:浏览发送/hello
请求,响应:Hello,Spring Boot 2
2.1、创建 POM
创建maven工程,在pom.xml
中引入SpringBoot的jar
配置相关依赖
- 这里按照官网提示,使用了一个父工程,指定了与SpringBoot框架相关的所有依赖的版本号2.6.4
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
</parent>
2.3、添加类路径依赖项
Spring Boot 提供了许多“启动器”,可让您将 jars 添加到类路径中 ,由于我们正在开发 Web 应用程序,因此我们添加了一个spring-boot-starter-web
依赖项 ,引入SpringBoot-web场景开发的依赖【指定了父工程,不需要版本号】
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.4、增加SpringBoot的main方法启动类
在 src -> main -> java 右键新建一个类MainApplication,如下:并给程序加上注解:@SpringBootApplication,相当于告诉 SpringBoot,这是一个 SpringBoot 应用。编写主程序 main 方法,让Spring应用把主类跑起来。
package com.lemon.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author Lemons
* @create 2022-03-07-10:53
*/
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
注解说明:
- @SpringBootConfiguration:指定该类属于配置类
- @EnableAutoConfiguration:这个注释告诉Spring Boot根据所添加的jar依赖关系“猜测”您如何配置Spring。就是相当于自动根据配置来启动Spring。
- @ComponentScan:应用程序启动时,指定需要扫描的包,默认是扫描当前包和其子包。
- @SpringBootApplication:默认通用的注解,是上面三个注解的替换注解,当使用springboot默认配置时,可使用该注解。
2.5、编写业务逻辑
1、在启动类所在目录同级的包下新建一个Controller包,创建Controller类,如上,标注一个 @Controller 的注解,编写一个方法处理 Hello 请求,处理后 @ResponseBody 返回字符串。由于处理器(Controller 类)会处理非常多的请求(方法),可能都会返回给浏览器信息,所以将 @ResponseBody
直接写在该类的上方,代表我们这个类里面的每一个方法返回的数据都直接是写给浏览器的,而不是跳转到某个页面。
@Controller
@ResponseBody
public class HelloController {
@RequestMapping("/hello") //1、请求映射
public String hand01() {
return "Hello World!";
}
}
2、@ResponseBody、@Controller 可用 @RestController 代替,因为 @RestController 内部就是两者的合体。
@RestController //自动装配
public class HelloController {
@RequestMapping("/hello")
public String hand01() {
return "Hello World!";
}
}
注解说明:
@RequestMapping
注释提供“路由”信息。它告诉 Spring 任何带有该/
路径的 HTTP 请求都应该映射到该hand01
方法。注释告诉 Spring 将@RestController
结果字符串直接呈现给调用者。
@Controller
:标明该类是一个控制器,属于@Component注解的一个分支,更加体现类的作用范围。
@ResponseBody
:该注解告诉Spring使得到的字符串直接返回给调用者。
@RestController
:该注解是@Controller和@ResponseBody的结合注解,可替换该两个注解。但在某些场景下,不能之间使用该注解,比如某一个方法需要做重定向跳转时。多用于第三方系统跳转。
2.5、测试
启动步骤:
通过run方法,先获取到SpringBoot的main方法作为启动入口,读取配置文件,然后注册相应的bean,比如需扫描的包,需要加载的Servlet,再加载需要启动的应用服务器,如tomcat等,然后发布应用程序。
直接运行启动类方法即可
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.4)
2022-03-07 11:01:35.255 INFO 18076 --- [ main] com.lemon.boot.MainApplication : Starting MainApplication using Java 1.8.0_131 on LAPTOP-DU0LC6FO with PID 18076 (E:\SpringBoot-01\target\classes started by lemon in E:\SpringBoot-01)
2022-03-07 11:01:35.262 INFO 18076 --- [ main] com.lemon.boot.MainApplication : No active profile set, falling back to 1 default profile: "default"
2022-03-07 11:01:36.265 INFO 18076 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-03-07 11:01:36.276 INFO 18076 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-03-07 11:01:36.276 INFO 18076 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.58]
2022-03-07 11:01:36.371 INFO 18076 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-03-07 11:01:36.372 INFO 18076 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1024 ms
2022-03-07 11:01:36.745 INFO 18076 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-03-07 11:01:36.755 INFO 18076 --- [ main] com.lemon.boot.MainApplication : Started MainApplication in 2.255 seconds (JVM running for 4.175)
浏览器输入API接口地址:localhost:8080/hello
,网页响应Hello,world
。成功
是不是感觉有点简单,没错,我们不需要去配置什么服务器什么的,因为Springboot已经帮我们都自动配置好了。
3、SpringBoot简化配置
SpringBoot所有的配置都可以写在一个配置文件里;点击 resources 右键,新建一个文件,固定名字叫 application.properties
;
配置服务器端口
比如在这个配置文件里可以修改TomCat服务器的端口号:可以这样简化配置,不用像以前大量的在各自的conf目录下的配置文件去修改。
server.port=8888
浏览器输入:localhost:8080/hello
,返回Hello,world 。成功
并且我们如果配置了Mybatis相关的,还可以配置MySQL数据库的数据源、密码等资源信息,那么该配置文件能够写什么东西呢?参考官方文档 Application properties:Core Properties,里面有各种类型的配置:
配置banner
有多种方式:
- 可自行在
application.yml
或者application.properties
中注入banner.location
,并将自定义图形文件放入该目录下
- 在根配置文件目录下直接放置
banner.txt
文件,因为这是固定名字- 在项目的
resources
目录下新建banner.txt
并将下面的文本写入
- 在项目的
4、简化部署--Creating an Executable Jar
创建一个可执行的 Jar 包,也就是我们只要引入 Spring Boot 给我们提供的插件,就可以把这个web项目直接打包成一个 Jar 包,不用像以前一样要先pom文件中package指定war包,再部署到服务器上,这个可执行的 Jar 包里边自带了我们整套项目的运行环境,一般称为 fat jars
;
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
保存pom.xml
并从命令行运行mvn package执行打包操作
,当然IDEA自动提供了Maven选项,如下使用打包,把 SpringBoot 应用 clean、package 打包;
打包完成:
进入target目录可以查看打包好的项目
在该目录下:直接cmd可以查看命令:dir
当然你也可以使用如下命令查看项目内部内容
$ jar tvf target/项目名.jar
这个jar包可以直接执行,在命令行输入:java -jar SpringBoot-01-1.0-SNAPSHOT.jar
访问localhost:8888/hello
,发现又可以访问了,从而简化了在服务器上的部署。
5、项目结构图如下
第三节:开发小技巧
1、Lombok
简化JavaBean开发:以前要给类的属性写get/set/toString等方法,麻烦【谨慎使用】
1、idea中搜索安装lombok
插件[新版本已经集成了该插件]
2、pom文件引入lombok
依赖,idea自动帮我们管理了版本
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
3、直接程序使用,如下
//===================简化JavaBean开发===================
@NoArgsConstructor //无参构造器
//@A1lArgsConstructor 使用该类的所有属性生成有参构造器
@Data //lombok的注解,帮我们生成已有属性的get/set方法
@ToString // lombok的注解,帮我们生成tostring方法
@EqualsAndHashCode //重写HashCode和Equals方法
public class User {
private String name ;
private Integer age;
private Pet pet ;
//当不想要全参数的构造器的时候,注释掉@AllArgsConstructor, 自己写
public User(String name , Integer age){
this.name = name;
this.age = age;
}
}
//===================简化日志打印===================
@Slf4j //就不用sysout了,直接日志打印
@RestController
public class HelloController{
@RequestMapping("/hello")
public String handle01 (@RequestParam("name") String name){
log.info("请求进来了....");
return "Hello, Spring Boot 2!" + "你好: "+ name;
}
}
2、dev-tools[热部署]
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
项目或者页面修改以后:Ctrl+F9进行项目重新编译;直接实时生效,不用重启项目了。
3、使用Spring Initializr快速构建工程
这个最重要:以前项目开发什么场景就要引入什么场景依赖,还要参考文档,再创建maven工程引入依赖,太麻烦,在此之前,我们主要通过Maven Archetype
来快速生成Maven项目,项目原型相对简陋,对各种IDE的支持也不太友好。然而通过Spring官方提供的Spring Initializr
来构建Maven项目,它不仅完美支持IDEA和Eclipse,而且能自动生成启动类和单元测试代码,给开发人员带来极大的便利!!
1、新建工程,找到Spring Initailizr(项目初始化向导)
在IDEA选择 File -> New - > Project -> Spring Initializr -> 点击Next 。
填写组织信息,工程名称,打包类型选择Jar ,点击Next。
2、选择我们需要的开发场景
比如选取web场景,这里我们选择Web依赖,点击Next。然后核对工程名称和工程路径,默认不变,选择Finish。
创建好后自动依赖引入,查看pom文件如下:引入了web场景、mybatis场景、单元测试场景、打包插件都引入了
3、创建好后的项目结构
4、自动编写好主程序类和测试类
自动编写好主程序类,只需要自己写dao/service/controller
,只需要关心业务开发,并且测试包下也自动帮我们生成了单元测试类
这个类不能删也不能改。我们要创建的存储dao接口、存储service接口和其实现类、以及Controller类的dao、service、controller包必须和这个主类在同一级,不然项目不能正常工作 ,因为规定是这样,不按约定就没法识别,约定大于配置。其中的application.properties
文件是Springboot的核心配置文件,但是我们常用的是yaml格式的配置文件。而test目录下有一个默认的测试类,用来测试的
直接运行主方法,可以看到其中有Tomcat启动的信息,我们直接输入localhost:8080回车,得到如下页面,默认跳转到/error的一个静态页面
因为引入了数据库mybatis,所以配置mysql数据源密码什么的也可以直接在配置文件进行配置即可
那么该配置文件能够写什么东西呢?参考官方文档 Application properties:Core Properties,里面有各种类型的配置: