SpringBoot的一些分析
程序员文章站
2022-05-03 11:01:50
...
1.tomcat哪里来?
springboot内嵌tomcat
通过 spring-boot-starter-web ----> spring-boot-starter-tomcat 导入了tomcat
2.SpringApplication.run是怎么启动的
public ConfigurableApplicationContext run(String... args) {
/*
*StopWatch是位于org.springframework.util包下的一个工具类,
通过它可方便的对程序部分代码进行计时(ms级别),适用于同步单线程代码块。
*/
StopWatch stopWatch = new StopWatch();
//开启计时器
stopWatch.start();
/*
ConfigurableApplicationContext
提供设置活动和默认配置文件以及操作底层属性源的工具。
*/
//创建一个新的工具默认为空
ConfigurableApplicationContext context = null;
//SpringBootExceptionReporter用于上报异常
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
//该方法只做了一件事:设置了一个名为java.awt.headless的系统属性
configureHeadlessProperty();
//创建所有 Spring 运行监听器并发布应用启动事件
SpringApplicationRunListeners listeners = getRunListeners(args);
//启动各个SpringApplicationRunListener 监听器实例(EventPublishingRunListener)
listeners.starting();
try {
//初始化默认应用参数类
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
//根据监听器和应用参数来准备 Spring 环境
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
configureIgnoreBeanInfo(environment);
//创建Banner
Banner printedBanner = printBanner(environment);
//创建应用上下文
context = createApplicationContext();
//异常报告器
exceptionReporters = getSpringFactoriesInstances(
SpringBootExceptionReporter.class,
new Class[] { ConfigurableApplicationContext.class }, context);
//应用上下文
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
//刷新应用上下文
refreshContext(context);
//刷新之后执行
afterRefresh(context, applicationArguments);
//停止计时监控类
stopWatch.stop();
//输出日志记录执行主类名、时间信息
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
//发布应用上下文启动完成事件
listeners.started(context);
//执行所有 Runner 运行器
callRunners(context, applicationArguments);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, listeners);
throw new IllegalStateException(ex);
}
try {
listeners.running(context);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, null);
throw new IllegalStateException(ex);
}
//返回应用上下文
return context;
}
3.web.xml,SpirngMvc.xml中的配置去哪儿了?
自动配置
4.spring-boot-starter-parent是干嘛的
是SpringBoot的父工程,管理了很多的基础依赖,如果我们要用里面的依赖,直接导入,不写版本.
5.spring-boot-starter-web是干嘛的
用来集成web(SpringMvc),把web层需要的jar包都给你引入进来了,包括: SpringMvc相关的包,日志相关包,JSON相关包,自动配置包,tomcat包等等
aaa@qq.com是干嘛的 :
相当于 @Controller + @ResponseBody
aaa@qq.com是干嘛
开启自动配置 : 通过一个导入选择器 AutoConfigurationImportSelector 会负责从 spring.factories文件中加载一些自动配置类
比如:前端控制器就通过一个 DispatcherServletAutoConfiguration 自动配置类完成,在这个类里面通过定义bean的方式定义了DispatcherServlet
的实例对象.
8.项目打包方式为什么是Jar
SpringBoot默认打jar包 ,
其他
dependencies : 父工程的dependencies标签下面的jar包会被子模块直接继承使用
dependencyManagement : 申明/管理依赖的 ,父工程的dependencyManagement标签下面的jar包默认子模块是用不了的,
如果只模块要用这个标签里面的jar包得显示的写出来, 这个标签主要用来统一管理jar包的版本号.