SpringBoot
springboot.png
SpringBoot作为近几年很火的微服务框架,只需要简单的几个依赖,少量的配置,就可以使用它快速搭建一个轻量级的微服务,优点是简单、快速、大道至简,缺点是真的太单一,不适于项目中的模块开发。
如果是单一的应用,比如做接口转发、项目启动,SpringBoot很合适这些场景,如果是项目开发,建议还是使用SpringCloud。
下面整理了一些理解SpringBoot和使用SpringBoot的内容,Spring官方说明请点击SpringBoot Starter。
理解SpringBoot
基本注解
SpringBootApplication
加载类
TypeExcludeFilter
AutoConfigurationExcludeFilter
EnableAutoConfiguration
AutoConfigurationImportSelector
Web服务
WebServer
SpringBoot 加载.jpg
按照图上的顺序,并且跟随SpringBoot的源码来进行断点跟踪,其实不难发现,SpringBoot加载顺序的逻辑意义:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
SpringBootApplication
在启动类上标记的 SpringBootApplication 注解,表明这是一个SpringBoot项目, 而 SpringApplication.run(Application.class, args);,作为SpringBoot的启动,也进入到图上的Initializer流程中;
Initializer
在Initializer中,主要的也就是 SpringApplication 类中,初始化加载了一些参数:
public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
this.sources = new LinkedHashSet();
this.bannerMode = Mode.CONSOLE;
this.logStartupInfo = true;
this.addCommandLineProperties = true;
this.headless = true;
this.registerShutdownHook = true;
this.additionalProfiles = new HashSet();
this.isCustomEnvironment = false;
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
this.webApplicationType = WebApplicationType.deduceFromClasspath();
this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = this.deduceMainApplicationClass();
}
大概在类中的第92行左右,初始化了log,initializer,listener,包括resources下的配置文件:application.yaml;
Scan
在 TypeExcludeFilter 和 AutoConfigurationExcludeFilter 里,带来的最主观的应该就是basepackage的scan了,像是为下个动作进行package的路径。
这里的逻辑很像Spring的设计风格,AOP,首先定义的切面,将绝对的package路径下的class进行扫描,得到对应的切点,得到切点了后面该怎么办?