欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot的一些分析

程序员文章站 2022-05-03 11:01:50
...

1.tomcat哪里来?

springboot内嵌tomcat
通过 spring-boot-starter-web ----> spring-boot-starter-tomcat 导入了tomcat
SpringBoot的一些分析SpringBoot的一些分析

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
SpringBoot的一些分析

aaa@qq.com是干嘛

开启自动配置 : 通过一个导入选择器 AutoConfigurationImportSelector 会负责从 spring.factories文件中加载一些自动配置类
SpringBoot的一些分析
比如:前端控制器就通过一个 DispatcherServletAutoConfiguration 自动配置类完成,在这个类里面通过定义bean的方式定义了DispatcherServlet
的实例对象.

8.项目打包方式为什么是Jar

SpringBoot默认打jar包 ,

其他

dependencies : 父工程的dependencies标签下面的jar包会被子模块直接继承使用
dependencyManagement : 申明/管理依赖的 ,父工程的dependencyManagement标签下面的jar包默认子模块是用不了的,
如果只模块要用这个标签里面的jar包得显示的写出来, 这个标签主要用来统一管理jar包的版本号.