Spring Boot 重温(一)

Felix 2019年11月05日 193次浏览

why

最近项目招人,负责部分面试工作,闲暇之余感觉是时候重新温习一下自己掌握的一些知识。

what

就先以最常用的 Spring Boot 来开始吧

when

每天写下来一小段也算日有一结

启动

我们首先来构建一个简单的 Spring Boot 项目。

  1. 新建 maven 工程
  2. 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
  1. 新建 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
  1. 新建 IndexController 以 RestAPI 为例,
    1. 添加 @RestController 注解,声明所有返回为 web respone body,直接返回 body.
    2. 如 controller 中声明方法 index(), 则默认访问路径为 "controller/",仍需声明 @RequestMapping
  2. 测试访问接口

原理

这里就需要来阅读 Spring Boot 的源码,大致流程如下

  1. 新建 SpringApplication 类实例对象
  2. 执行 run,基本上是以 SpringApplicationRunListener 的几个接口执行: starting / environmentPrepared / contextPrepared / contextLoaded / started / running 以及执行异常 failed