Spring系列:SpringBoot框架
使用SpringBoot已经3年了,是该好好总结下了
一、理论基础
1.1、什么是SpringBoot
从本质来说SpringBoot就是Spring,它去掉了Spring繁琐的XML配置,只需少量配置即可。
1.2、SpringBoot优点
(1)去配置化,简便开发
(2)提供嵌入式HTTP服务器,如Tomcat,可以轻松地开发和测试
(3)提供命令行接口(CLI)工具,可用于开发和测试
1.3、RESTful 风格介绍
传统MVC模式开发会直接返回给客户端一个视图,但是RESTful Web服务返回JSON形式(前后端分离)
1.4、如何理解 Spring Boot 中的 Starters?
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖
二、SpringBoot启动过程
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
(1)Application 的 main 方法里我压根没有任何地方引用Controller 类,那么它的代码又是如何被服务器调用起来的呢?
通过SpringApplication.run() ,SpringBoot 肯定是在某个地方扫描了当前的 package,将带有 RestController 注解的类作为 MVC 层的 Controller 自动注册进了 Tomcat Server
(2)探索 ClassLoader类加载机制-SpringbootLoader
打包时它使用了 FatJar 技术将所有的依赖 jar 包一起放进了最终的 jar 包中的 BOOT-INF/lib 目录中,当前项目的 class 被统一放到了 BOOT-INF/classes 目录中。
在运行机制上,使用 FatJar 技术运行程序是需要对 jar 包进行改造的,它还需要自定义自己的 ClassLoader 来加载 jar 包里面 lib 目录中嵌套的 jar 包中的类
疑问:当 JVM 遇到一个不认识的类,BOOT-INF/lib 目录里又有那么多 jar 包,它是如何知道去哪个 jar 包里加载呢?
rootClassLoader 就是双亲委派模型里的 ExtensionClassLoader ,JVM 内置的类会优先使用它来加载。如果不是内置的就去查找这个类对应的 Package。
ClassLoader 会在本地缓存包名和 jar包路径的映射关系,如果缓存中找不到对应的包名,就必须去 jar 包中挨个遍历搜寻,这个就比较缓慢了。不过同一个包名只会搜寻一次,下一次就可以直接从缓存中得到对应的内嵌 jar 包路径。
(3)Controller 自动注册
Controller 没有被代码引用,它是如何注册到 Tomcat 服务中去的?——它靠的是注解传递机制。
SpringBoot 深度依赖注解来完成配置的自动装配工作,它自己发明了几十个注解。
A、首先 main 方法可以看到的注解是 SpringBootApplication,这个注解又是由ComponentScan 注解来定义的,ComponentScan 注解会定义一个被扫描的包名称,如果没有显示定义那就是当前的包路径。
B、SpringBoot 在遇到 ComponentScan 注解时会扫描对应包路径下面的所有 Class,根据这些 Class 上标注的其它注解继续进行后续处理。当它扫到Controller 类时发现它标注了 RestController 注解,而 RestController 注解又标注了 Controller 注解。
C、SpringBoot 对 Controller 注解进行了特殊处理,它会将 Controller 注解的类当成 URL 处理器注册到 Servlet 的请求处理器中,在创建 Tomcat Server 时,会将请求处理器传递进去。Controller 就是如此被自动装配进 Tomcat 的。
三、源码分析
....待更新
