Spring Boot基础
介绍
Spring Boot是由Pivotal团队提供的全新框架
,其设计目的是用来简化Spring应用的初始搭建
以及开发过程。该框架使用了特有的方式
来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种快速配置的方式,Spring Boot在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
- 特有的配置方式:
使用yml
或者properties
配置文件进行所有场景的配置(例如spring mvc,mybatis等场景的配置),同时提供了一个注解进行Spring Boot组件的扫描。
- 框架基础:
Spring Boot = Spring MVC + Spring
在现在的Sping大家族中,Spring Boot是spring生态圈的基础,整个spring生态圈都可以基于spring boot去进行开发。
- 总结
- spring boot是整合spring技术栈的一站式框架。
- spring boot是简化spring技术栈的快速开发脚手架。
时代背景
微服务
- 微服务是一种架构风格。
- 一个应用拆分为一组小型服务(
分成多个spring cloud项目
)。 - 服务之间使用轻量级HTTP进行交互。
- 服务围绕业务功能进行拆分。
- 可以进行自动化部署。
- 去中心化,可以服务自治,一个应用可以不用同一门语言开发。
分布式的困难
- 远程调用
- 服务发现
- 负载均衡
- 服务容错
- 配置管理
- 服务监控
- 链路追踪
- 日志管理
- 任务调度
解决方案:Spring Cloud + Spring Boot
云原生
原生应用如何上云,即Cloud Native
上云的困难:
- 服务自愈
- 弹性伸缩
- 服务隔离
- 自动化部署
- 灰度发布
- 流量治理
基础知识
依赖管理
- 依赖方式
Spring Boot使用一个父项目,将开发中经常用到的依赖的对应版本都规定好了,在引入依赖的时候通过父类引入相应的版本即可。这种方式称为Spring Boot的版本仲裁
。例如:
自己项目的pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
其父项目为spring-boot-starter-parent。
spring-boot-starter-parent-2.2.5.RELEASE.pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
其父项目为spring-boot-dependencies。
spring-boot-dependencies.pom
在这个文件中就定义了各种依赖的版本,例如:
<properties>
<commons-codec.version>1.13</commons-codec.version>
<commons-dbcp2.version>2.7.0</commons-dbcp2.version>
<commons-lang3.version>3.9</commons-lang3.version>
<commons-pool.version>1.6</commons-pool.version>
<commons-pool2.version>2.7.0</commons-pool2.version>
<jackson.version>2.10.2.20200130</jackson.version>
<jackson-bom.version>${jackson.version}</jackson-bom.version>
<jedis.version>3.1.0</jedis.version>
<junit.version>4.12</junit.version>
<junit-jupiter.version>5.5.2</junit-jupiter.version>
<kafka.version>2.3.1</kafka.version>
<log4j2.version>2.12.1</log4j2.version>
<logback.version>1.2.3</logback.version>
<lombok.version>1.18.12</lombok.version>
...
</properties>
即依赖方式如下:
备注:如果要将本地项目中的依赖修改成别的版本,可以在自己的pom文件中进行类似如下的修改。
<properties>
<mysql.version>5.1.7</mysql.version>
</properties>
- 场景启动器-starter
在依赖中类似于spring-boot-starter-*
的依赖表示引入某个场景下所需要的所有依赖,例如spring-boot-starter-web就会引入所有和web开发相关的依赖(例如tomcat,spring-mvc等)。
- 备注:spring boot官网提供的<a href="https://docs.spring.io/spring-boot/docs/2.4.4/reference/html/using-spring-boot.html#using-boot-starter">starter的网址</a>
https://docs.spring.io/spring-boot/docs/2.4.4/reference/html/using-spring-boot.html#using-boot-starter
- 如果是“*-spring-boot-starter”命名的方式就是一些第三方提供的场景启动器。
所有场景启动器的底层依赖为:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.5.RELEASE</version>
<scope>compile</scope>
</dependency>
启动器的依赖管理是根据maven的依赖特性来进行管理的,在IDEA中可以通过Ctrl+Shift+Alt+U
来查看一个pom文件的依赖树。
自动配置
Spring Boot会自动帮助我们配好很多依赖的配置(例如tomcat,spring mvc等配置)。一个新建的基础项目会帮我们自动配置好如下内容:
-
自动配置Tomcat
-
spring boot会自动引入tomcat依赖(在
spring-boot-starter-web
中)。 -
自动配置好tomcat相关的默认配置。
-
- 自动配置好Spring MVC
- 引入Spring MVC全套组件。
- 自动配置好Spring MVC常用的组件,例如DispatchServlet,ViewResolver等。
- 自动配置好web常见的功能,例如字符编码问题和文件上传等。
备注:我们可以在Spring Boot的启动类中查看Spring容器中已经配置好的对象
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(Application.class, args);
// 获取Spring 容器中所有bean对象的名称
String[] beanDefinitionNames = run.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
可以查看spring bean容器中所有的实例对象,包括自动配置的和我们自己定义的。
- 配置好默认的包结构
Spring Boot有自己规定好的包结构:
- project
- src
-main
- java
package
- controller
- service
xxxApplication.java
- resources
application.yml | application.properties
-test
- java
- resources
-
即在源代码的根路径中要创建一个xxxApplication.java用来作为Spring Boot的唯一入口。
-
其配置文件只能是
.yml
或者.properties
文件
在这种约定格式下无需再配置包扫描。同时Spring Boot也允许我们配置包扫描的路径,即使用
- @SpringBootApplication(scanBasePackages="cn.net.smrobot")
或者
- @ComponentScan("cn.net.smrobot")
注意:在Spring Boot中约定大于配置!!!
-
各种配置都有默认的值
Spring Boot会将配置映射到某一个类上的属性值上,同时将该类注入到Spring容器中。
- 按需加载所有的自动配置项
引入哪些场景就会开启该场景下的自动配置。Spring Boot的所有自动配置功能都在spring-boot-autoConfigure
包里面,该包下的类不一定会生效,只会按需加载(是@Conditional注解
在起作用)。
- 备注:spring boot配置的<a href="https://docs.spring.io/spring-boot/docs/2.4.4/reference/html/appendix-application-properties.html#common-application-properties">官网</a>
https://docs.spring.io/spring-boot/docs/2.4.4/reference/html/appendix-application-properties.html#common-application-properties
Hello项目
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
//开启自动配置
@EnableAutoConfiguration
// 配置包扫描
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
// controller.HelloController.java
package cn.net.smrobot.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
// 声明为controller
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello World!";
}
}