why
最近项目招人,负责部分面试工作,闲暇之余感觉是时候重新温习一下自己掌握的一些知识。
what
就先以最常用的 Spring Boot 来开始吧
when
每天写下来一小段也算日有一结
启动
我们首先来构建一个简单的 Spring Boot 项目。
- 新建 maven 工程
- pom 添加依赖
# 添加 parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
# 添加 starter 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
# 添加 build 插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
build 插件作用
- 将所有的依赖包打入一个 jar ,方便执行
- 自动查找 main 方法作为执行 API 执行入口
- 自动匹配依赖 jar 的版本, jar 包的版本可以通过在依赖声明中override
- 新建 Application main
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
此处 @SpringBootApplication 主要包含一下几个注解
- @SpringBootConfiguration -> @Configuration 用来装载 spring 自己的 bean,以及初始化上下文
- @EnableAutoConfiguration 用来装载 pom 中 starter 的默认配置,并初始化对应的 bean
- @ComponentScan 默认扫描当前类所在目录以及子目录下的所有 class,并装载 bean
- 新建 IndexController
以 RestAPI 为例,
- 添加 @RestController 注解,声明所有返回为 web respone body,直接返回 body.
- 如 controller 中声明方法 index(), 则默认访问路径为 "controller/",仍需声明 @RequestMapping
- 测试访问接口
原理
这里就需要来阅读 Spring Boot 的源码,大致流程如下
- 新建 SpringApplication 类实例对象
- 执行 run,基本上是以 SpringApplicationRunListener 的几个接口执行: starting / environmentPrepared / contextPrepared / contextLoaded / started / running 以及执行异常 failed