springBoot学习

 
第一部分:SpringBoot应用回顾
 
1.1 概念
约定优于配置,又称按约定编程,是一种软件设计规范,大大减少了配置项,只有在偏离这个约定的时候才需要做相关的配置。
 
1.2 特性
1)SpringBoot Starter(起步依赖):他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中。
起步依赖:就是把具有某种功能坐标的打包到一起,并提供一些默认功能。
解决问题:依赖管理的坐标信息比较繁杂;容易产生依赖版本冲突。
2)使编码变得简单,SpringBoot采用JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大地提高了工作效率。
如果想在Spring Boot中生成一个bean对象存到Ioc容器中,可以使用@Configuration+@bean的方式(Spring框架怎么生成一个bean对象的呢?@Component)
0
3)自动配置:SpringBoot的自动配置特性利用了Spring对条件化配置的支持,合理的推测应用所需要的bean并自动化配置它们。
SpringBoot在启动的过程中(根据依赖引入的情况),会自动将一些配置类的bean进行创建,并且添加到Ioc容器中。
4)使部署变得简单,SpringBoot内置了三种servlet容器,Tomcat,Jetty,undertow,我们只需要一个java运行环境就可以跑SpringBoot项目了,SpringBoot项目可以打成一个jar包。
 
1.3 案例实现
Spring Initiallizr是一个web项目,它提供了一个基本的项目结构,能够帮我们快速构建一个基础的Spring Boot项目
案例实现过程中的疑问:
1. starter是什么?我们如何去使用这些starter?
2. 为什么包扫描只会扫描核心启动类所在的包及其子包
3. 在springBoot启动的过程中,是如何完成自动装配的?
4. 内嵌Tomcat是如何被创建及启动的?
5. 使用了web场景对应的starter,springmvc是如何自动装配?
 
1.4 热部署
1.4.1 热部署设置
1)导包
 
org.springframework.boot
spring-boot-devtools
 
2)idea工具热部署设置
见讲义
3)热部署原理
引入热部署插件后,插件会监控我们classpath的资源变化,当classpath有变化时,会触发重启。
 
插件重启快速的原因:这里对类加载采用了两种类加载器,对于第三方jar包采用base-classloader来加载,对于开发人员自己开发的代码使用restartClassLoader来进行加载,这使得比停掉服务要快的多,因为使用插件只是重启开发人员编写的代码的部分。
 
1.5 全局配置文件
1.5.1 概述及优先级
全局配置文件可以对一些默认配置值修改和自定义配置
默认配置文件名:application.properties,application.yml
优先级:
0
 
1.6 属性注入
1)属性注入常用注解
0
0
1.7 SpringBoot日志框架
SpringBoot框架默认使用SLF4J+LogBack,默认日志级别为INFO
 
第二部分:SpringBoot源码剖析
2.1 依赖管理
1)为何导入dependency不需要指定版本号(部分依赖不需要指定版本号)
pom.xml中的两个核心依赖:
spring-boot-starter-web,spring-boot-starter-parent
spring-boot-starter-parent的父依赖spring-boot-dependencies里面定义了springboot相关的版本。
 
2) spring-boot-starter-parent父依赖启动器的主要作用是进行版本统一管理,那么项目
运行依赖的JAR包是从何而来的?
spring-boot-starter-web依赖启动器的主要作用是打包了Web开发场景所需的底
层所有依赖(基于依赖传递,当前项目也存在对应的依赖jar包)
 
2.2 SpringBoot自动配置(原理)
自动配置:根据我们添加的jar包依赖,会自动将一些配置类的bean注册进Ioc容器,我们可以在需要的地方使用@AutoWired或@Resource等注解来使用它。
 
问题:Spring Boot到底是如何进行自动配置的,都把哪些组件进行了自动配置?
SpringBoot的应用程序入口是@SpringBootApplication注解标注类中的main方法。
 
2.2.1 @SpringBootApplication注解
@SpringBootApplication注解是一个组合注解,除了 4 个元注解外, 还使用了 3 个核心注解:@SpringBootConfiguration(标明该类是配置类)、@EnableAutoConfiguration(启动自动配置)、
@ComponentScan(注解扫描)
0
2.2.2 @SpringBootConfiguration
@SpringBootConfiguration注解内部有一个核心注解@Configuration,该注解是Spring框架提供的,表示当前类为一个配置类(XML配置文件的注解表现形式),并可以被组件扫描 器扫描。
由此可见,@SpringBootConfiguration注解的作用与@Configuration注解相同,都是标识一个可以被组件扫描器扫描的配置类,只不过@SpringBootConfiguration是被Spring Boot进行了重新封 装命名而已.
0
2.2.3 @EnableAutoConfiguration注解
0
Spring 中有很多以 Enable 开头的注解,其作用就是借助 @Import 来收集并注册特定场景相关的 Bean ,并加载到 IOC 容器。 @EnableAutoConfiguration就是借助@Import来收集所有符合自动配置条件的bean定义,并加载到 IoC容器。
1)@AutoConfigurationPackage
0
AutoConfigurationPackages.Registrar这个类就干一个事,注册一个 Bean ,这个 Bean 就是 org.springframework.boot.autoconfigure.AutoConfigurationPackages.BasePackages ,它有 一个参数,这个参数是使用了 @AutoConfigurationPackage 这个注解的类所在的包路径,保存自动配置 类以供之后的使用,比如给 JPA entity 扫描器用来扫描开发人员通过注解 @Entity 定义的 entity 类。
2)@Import(AutoConfigurationImportSelector.class)
@Import({AutoConfigurationImportSelector.class}) :将 AutoConfigurationImportSelector 这个类导入到 Spring 容器中, AutoConfigurationImportSelector 可以帮助 Springboot 应用将所有符合条件的 @Configuration 配置都加载到当前 SpringBoot 创建并使用的 IOC 容器( ApplicationContext )中。
 
跟自动配置逻辑相关的入口方法在 DeferredImportSelectorGrouping 类的 getImports 方法处---》或者AutoConfigurationImportSelector里的process()方法
0
0
上述[1]AutoConfigurationEntry 方法主要做的事情就是获取符合条件的自动配置类,避免加载不必要的自 动配置类从而造成内存浪费
AutoConfigurationEntry主要做的事情如下:
[1]加载每个jar包下的MATA-INF/spring.factories配置文件里key为EnableAutoConfiguration的所有可以自动配置的工厂类的全路径
0
 
0
至此,只是把满足条件的自动配置类筛选出来,把这些自动配置类注册到Ioc容器里还要交给Spring去处理

1. 从spring.factories配置文件中加载自动配置类;
2. 加载的自动配置类中排除掉 @EnableAutoConfiguration 注解的 exclude 属性指定的自动配置
类;
3. 然后再用 AutoConfigurationImportFilter 接口去过滤自动配置类是否符合其标注注解(若有
标注的话) @ConditionalOnClass , @ConditionalOnBean 和
@ConditionalOnWebApplication 的条件,若都符合的话则返回匹配结果;
4. 然后触发 AutoConfigurationImportEvent 事件,告诉 ConditionEvaluationReport 条件评
估报告器对象来分别记录符合条件和 exclude 的自动配置类。
5. 最后spring再将最后筛选后的自动配置类导入IOC容器中
 
0
2.2.4 @ComponentScan注解
主要是从定义的扫描路径中,找出标识了需要装配的类自动装配到spring 的bean容器中。
当前@ComponentScan注解没有标注basePackages及value,所以扫描路径默认为@ComponentScan注解的类所在的包为基本的扫描路径
(也就是标注了@SpringBootApplication注解的项目启动类所在的路径)
这也是为何SpringBoot启动时只会扫描核心启动类所在的包及其子包的原因!
 
2.4 源码剖析-Run方法执行流程
点进去run方法--》调用其重载run方法---》该方法做了两件事:1)初始化SpringApplication;2)执行run方法
2.4.1 初始化SpringApplication
0
2.4.2 run()方法执行过程
0
1)EventPublishingRunListener监听器是Spring容器的启动监听器。 listeners.starting(); 开启了监听事件。
2)应用上下文环境包括什么呢?包括计算机的环境,Java环境,Spring的运行环境,Spring项目的配置(在SpringBoot中就是那个熟悉的application.properties/yml)等等。
 
0
 
0
3)应用上下文可以理解成IoC容器的高级表现形式,应用上下文确实是在IoC容器的基础上丰富了一 些高级功能。应用上下文对IoC容器是持有的关系。他的一个属性beanFactory就是IoC容器 (DefaultListableBeanFactory)。所以他们之间是持有,和扩展的关系。
在这一步,Ioc也创建了。
4)将一些bean注册进Ioc容器,包括主配置类,发布容器已加载事件
5)Ioc的初始化过程(分为以下三步):
 
0
 
0
 
0
2.5 自定义starter
 
2.6 内嵌Tomcat
SpringBoot是如何启动内置tomcat的?
Spring项目启动--》调用run方法---》SpringBoot相关的处理工作完成后,会调用一个refreshConext()方法刷新容器---》内部调用Spring的refresh()方法(该方法是实现IOC和AOP的关键,AbstractApplicationContext类的方法)
---》进入refresh()方法后,该方法又调用了一个onRefresh()方法,该方法会调用ServletWebServerApplicationContext中的createWebServer()方法,该方法用于启动web服务器
 
0
SpringBoot为什么可以响应请求,他是如何配置的SpringMvc
1)SpringBoot引入了SpringMVC的相关依赖,可以使用RequestMapping注解配置请求的url
 
SpringMVC的前端控制器DispatcherServlet必须注册到ServletContext中才可以响应请求(如何被注册的?)
DispatcherServlet如何创建的及如何注册的?
2)
springboot mvc的自动配置类是DispatcherServletAutoConfigration,主要做了两件事: 1)配置DispatcherServlet 2)配置DispatcherServlet的注册Bean(DispatcherServletRegistrationBean)
 
SpringBoot自动装配SpringMvc其实就是往ServletContext中加入了一个 Dispatcherservlet
 
servletContext.addServlet(name, this.servlet);
 
第三部分:SpringBoot数据访问
 
第四部分:SpringBoot缓存深入
 
第五部分:SpringBoot部署于监控
posted @ 2021-05-09 10:39  冰湖一角  阅读(179)  评论(0编辑  收藏  举报