Springboot主要提供用户快速搭建WEB应用,简化配置文件,mevan默认引入包解决版本冲突问题,内嵌tomcat快启动web
Springboot工程结构,POM.xml,使用mevan管理包的版本依赖管理。
- 引用springboot父工程
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.8.RELEASE</version>
</parent>
- spring-boot-starter-parent里又引用默认的依赖集
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.8.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
-
spring-boot-dependencies 默认引用的所有包版本。
<activemq.version>5.15.12</activemq.version> <antlr2.version>2.7.7</antlr2.version> <appengine-sdk.version>1.9.80</appengine-sdk.version> <artemis.version>2.10.1</artemis.version> <aspectj.version>1.9.5</aspectj.version> <assertj.version>3.13.2</assertj.version> <atomikos.version>4.0.6</atomikos.version> <awaitility.version>4.0.3</awaitility.version> <bitronix.version>2.1.4</bitronix.version> <build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version> <byte-buddy.version>1.10.11</byte-buddy.version> <caffeine.version>2.8.4</caffeine.version> <cassandra-driver.version>3.7.2</cassandra-driver.version>
启动过程
SpringApplication.run(Application.class, args);//启动应用入口
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
this.configureHeadlessProperty();
SpringApplicationRunListeners listeners = this.getRunListeners(args);
listeners.starting();//ApplicationEvent 调用监听器触发ApplicationEvent事件,典型的监听者设计模式
Collection exceptionReporters;
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
this.configureIgnoreBeanInfo(environment);
Banner printedBanner = this.printBanner(environment);
//创建servlet上下文AnnotationConfigServletWebServerApplicationContext
context = this.createApplicationContext();
exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
this.refreshContext(context);//启动Spring上下文的refresh加载容器
this.afterRefresh(context, applicationArguments);
stopWatch.stop();
if (this.logStartupInfo) {
(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
}
listeners.started(context);
this.callRunners(context, applicationArguments);
} catch (Throwable var10) {
this.handleRunFailure(context, var10, exceptionReporters, listeners);
throw new IllegalStateException(var10);
}
try {
listeners.running(context);
return context;
} catch (Throwable var9) {
this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);
throw new IllegalStateException(var9);
}
}
appliction 启动时可以通过这些事件进行拦截处理
hdk
class org.springframework.boot.context.event.ApplicationStartingEvent
hdk
class org.springframework.boot.context.event.ApplicationStartingEvent
hdk
class org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent
hdk
class org.springframework.boot.context.event.ApplicationContextInitializedEvent
hdk
class org.springframework.boot.context.event.ApplicationPreparedEvent
hdk
class org.springframework.context.event.ContextRefreshedEvent
hdk
class org.springframework.boot.context.event.ApplicationPreparedEvent
hdk
class org.springframework.boot.context.event.ApplicationStartedEvent
tomcat启动
ServletWebServerApplicationContext
protected void onRefresh() {
super.onRefresh();
try {
this.createWebServer();//创建tomcat
} catch (Throwable var2) {
throw new ApplicationContextException("Unable to start web server", var2);
}
}
protected void finishRefresh() {
super.finishRefresh();
WebServer webServer = this.startWebServer();
if (webServer != null) {
this.publishEvent(new ServletWebServerInitializedEvent(webServer, this));
}
}
启动自动配置spring.boot.autoconfigure,此包里有各种包的配置类,简化了之前繁琐的xml配置,
注解@SpringBootApplication-》@EnableAutoConfiguration作用主要是告诉SpringFactoriesLoader
去 META-INF/spring.factories下加载org.springframework.boot.autoconfigure.EnableAutoConfiguration的所有配置。
总结springboot快速构建WEB应用,减少各种插件的配置,包的版本依赖管理,使用autoconfigure提供默认的配置。