Spring Boot(一)—— 快速入门及原理分析

4,309 阅读4分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

一、代码实现

1. 创建maven工程,普通的java工程

2. 添加SpringBoot的起步依赖

SpringBoot要求,项目要继承SpringBoot的起步依赖 spring-boot-starter-parent

     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.0.1.RELEASE</version>
     </parent>

SpringBoot要集成SpringMVC进行Controller的开发,所以项目要导入web的启动依赖

     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
     </dependencies>

3. 编写SpringBoot引导类

引导类必须放在与controller等包同级目录

 package com.xiaojian;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 ​
 @SpringBootApplication
 public class Application {
     public static void main(String[] args) {
         SpringApplication.run(Application.class);
     }
 ​
 }

4. 编写Controller类

 package com.xiaojian.controller;
 ​
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 ​
 @Controller
 public class QuickController {
 ​
     @RequestMapping("/quick")
     @ResponseBody
     public String quick(){
         return "hello SpringBoot";
     }
 }

@ResponseBody 必须加上。

5. 测试

浏览器访问 : localhost:8080/quick 显示: hello SpringBoot

二、入门解析

1.SpringBoot代码解析

  1. 所有SpringBoog工程中,都要在pom.xml添加父工程依赖(spring-boot-starter-parent),后面进行源码分析
  2. 以功能为单位,如需要web功能在浏览器进行访问,秩序添加依赖(spring-boot-starter-web)
  3. @SpringBootApplication,声明该类是SpringBoot的引导类 run方法运行SpringBoot引导类,参数是引导类的字节码对象
 @SpringBootApplication
 public class Application {
     public static void main(String[] args) {
         SpringApplication.run(Application.class);
     }
 }

2.SpringBoot工程热部署(好东西啊)

我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大量的时间,我们可以在修改代码后不重启就能生效,在pom.xml中添加如下配置就可以实现这样的功能,我们称之为热部署

 <!--热部署配置-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
 </dependency>

ps:IDEA进行SpringBoot进行热部署失败的解决方案

  1. Setting -> Compiler -> Build project automatically
  2. 然后 Shift+Ctrl+Alt+/,选择Registry,在列表中找到 compiler.automatically.allow.when.app.running 打钩 完成

三、原理分析

1. 起步依赖原理分析(查看源码)

  • 分析spring-boot-starter-parent

    • spring-boot-starter-parent中也有父依赖spring-boot-starter-dependencies,从中可以看到一部分坐标的版本、依赖管理、插件管理已经定义好,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了。 所以起步依赖的作用就是进行依赖的传递。
  • 分析spring-boot-starter-web

    • spring-boot-starter-web就是将web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用。在以后需要添加的功能也是同理

2. 自动配置

@SpringBootApplication 注解 相当于配置三个注解

 @SpringBootConfiguration // 相当于 @Configuration ,配置Spring容器(@Bean,注册bean对象,标注在返回某个实例的方法)
 @EnableAutoConfiguration // 自动配置
 @ComponentScan( // 组件扫描,扫描与引导类同级目录包下的bean
     excludeFilters = {@Filter(
     type = FilterType.CUSTOM,
     classes = {TypeExcludeFilter.class}
 ), @Filter(
     type = FilterType.CUSTOM,
     classes = {AutoConfigurationExcludeFilter.class}
 )}
 )

接口EnableAutoConfiguration (重要)

20200717161600

@AutoConfigurationPackage

image-20200717163939015

将主配置类(@SpringBootApplication标注的类)同级目录下的所在包,及下面所有子包里面的所有组件扫描到Spring容器

image-20200717164031337

@Import注解

通过导入的方式实现把实例加入springIOC容器中

20200710142953

AutoConfigurationImportSelector:

导入哪些组件的选择器

将所有需要导入的组件以全类名的方式返回;这些组件被添加到容器中。

会给容器中导入非常多的自动配置类(xxxAutoConfiguration);

就是给容器中导入这个场景需要的所有组件,并配置好这些组件。

在该类中获取全类名的方法中,调用 getCandidateConfigurations( ... )

image-20200803143353048

loadFactoryNames( ... ) ,使用类加载器加载目标位置的资源(也就是需要导入的组件全类名),并存入Properties中返回

image-20200803144045379

目标位置为

image-20200803144309171

自动导入组件全过程图解:

SpringBoot 在启动的时候,从springboot的autoconfigure包的类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值(组件全类名),将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。

以前我们需要自己配置的东西,自动配置类帮我们做了(对比SSM中的各大配置属性)

SpringBoot自动配置原理

四、SpringBoot项目目录结构

resources文件夹

  • static:保存所有静态资源,js,css,images;
  • templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持jsp页面),可以使用模板引擎(freemarker,thymeleaf)
  • application.properties:Spring Boot应用的配置文件;