天天看点

每日一练进击大厂「DAY12」SpringBoot

作者:炯哈哈

文章目录

  • 一、SpringBoot定义
  • 二、SpringBoot优点
  • 三、SpringBoot核心注解
  • 四、SpringBoot自动装配原理
  • 五、SpringBoot启动流程
  • 六、SpringBoot扫描流程
  • 七、Spring和SpringBoot常用注解
  • 八、如何理解SpringBoot中的Starter
  • 九、SPI机制
  • 十、SpringBood的约定优于配置是如何理解的
  • 总结

一、SpringBoot定义

用来简化spring应用的初始搭建以及开发过程,使用特定的方式来进行配置,创建独立的spring应用程序,嵌入tomcat无需部署war文件,简化maven配置,自动配置spring添加对应功能starter自动化配置。

二、SpringBoot优点

  • 减少开发时间
  • 使用java config有助于避免使用xml
  • 避免大量的maven导入和各种版本冲突
  • 通过提供默认值快速开始开发
  • 没有单独的web服务器需要,意味着不再需要启动tomcat
  • 需要更少的配置,没有web.xml文件,只需添加@Configuration注释的类,然后添加@Bean注释的方法,spring将自动加载对象并像以前一样对其进行管理。

三、SpringBoot核心注解

  • @SpringBootApplication:是springBoot的核心注解,主要包含一下3个注解@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项@ComponentScan:spring组件扫描

四、SpringBoot自动装配原理

Spring Boot自动配置的核心注解是@SpringBootApplication,该注解是SpringBoot的启动类注解,它是一个复核注解,里面包含

  1. @SpringBootConfiguration:该注解上有一个@Configuration注解,表示这个SpringBoot启动类是一个配置类,最终要被注入到spring容器中
  2. @EnableAutoConfituration:表示开启自动配置,它也是一个复合注解,里面包含@AutoConfigurationPackage该注解上有一个@Import(AutoConfigurationPackages.Registar.class)注解,其中Registrar类的作用是将启动类所在包下的所有子包的组件扫描注入到spring容器中。@Import(AutoConfigurationImportSelector.class):其中AutoConfigurationImportSelector类中有一个getCandidateConfigurations()方法,该方法通过SpringFactoriesLoader.loadFactoryNames()方法查找位于META-INF/spring.factories文件中的所有自动配置类,并加载这些类,所以spring.boot在整个的启动过程中,其实就是在类路径的META-INF

    /spring.factories文件中找到EnableAutoConfiguration对应的所有的自动配置类,然后将所有自动配置类加载到spring容器中。

五、SpringBoot启动流程

  1. 加载配置文件获取所有实现SpringApplicationRunListener这个接口的监听器调用监听器中的starting方法
  2. 准备上下文环境
  3. 创建上下文环境
  4. 设置完环境变量会调用监听器的相关方法
  5. 进入到spring启动容器的方法servletWebServerApplicationContext类下的refresh方法
  6. 调用监听器的started方法
  7. 计算springboot启动时间
  8. 执行监听器的ready方法
  9. 启动完成

六、SpringBoot扫描流程

  1. 调用run方法中的refreshContext方法
  2. 调用AbstractApplication中的refresh方法
  3. 委托给invokeBeanFactoryPostProcessors去处理调用链
  4. 其中一个方法postProcessBeanDefinitionRegistry会去调用processConfigBeanDefinitions解析beandefinitions
  5. 在processConfigBeanDefinitions中有一个parse方法,其中componentscanParser.parse的方法会扫描当前路径下的所有component组件

七、Spring和SpringBoot常用注解

  • @Autowired:自动导入对象到类中,被注入进的类同样要被spring容器管理;
  • @Component:通用的注解,可标注任意类为spring组件。
  • @Repository:对应持久层及DAO层,主要英语数据库相关操作
  • @Service:对应服务层,主要设计一些复杂的逻辑,需要用到Dao层;
  • @Controller:对应springMVC控制层,主要用于接受用户请求并调用service层返回数据给前端页面;
  • @RestController:是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且将函数的返回值直接填入HTTP响应体中,是REST风格的控制器。
  • @Scope:声明bean的作用域
  • @Configuration:用来声明配置类,可以使用@Component注解代替

八、如何理解SpringBoot中的Starter

Starter是SpringBoot的四大核心功能特性之一,其他的有自动装配、Actuator监控、命令行界面。

Starter组件以功能为维度,来维护对应的jar包的版本依赖,使得开发者可以不需要去关心这些版本冲突这种容易出错的细节。

Starter组件会把对应功能的所有jar包依赖全部导入进来,避免开发者自己去引入依赖带来的麻烦。

Starter内部集成了自动装配的机制,程序中依赖对应的Starter组件之后,这个组件自动会集成到Spring生态下,并且对于相关Bean的管理也是基于自动装配机制来完成的。

九、SPI机制

java spi机制:

META-INF/services/ 目录:实例化该目录下的类 。

通过ServiceLoader.load方法找到META-INF/services/ 目录下的文件,然后拿到文件配置的全限定名,根据反射去实例化该类无论使不使用,都会去实例化

springboot spi机制:

META-INF/spring.factories/ 目录:根据key找到相应的类去实例化

SpringFactoriesLoader加载会加载META-INF/spring.factories

从CLASSPATH下的每个Jar包中搜寻所有META-INF/spring.factories配置文件

然后将解析properties文件,找到指定名称的配置后返回,工厂模式反射创建好bean

需要注意的是,其实这里不仅仅是会去ClassPath路径下查找,会扫描所有路径下的Jar包,只不过这个文件只会在Classpath下的jar包中。

dubbo spi机制:

META-INF/services/ 目录:该目录下的 SPI 配置文件是为了用来兼容 Java SPI 。

META-INF/dubbo/ 目录:该目录存放用户自定义的 SPI 配置文件。

META-INF/dubbo/internal/ 目录:该目录存放 Dubbo 内部使用的 SPI 配置文件。

十、SpringBood的约定优于配置是如何理解的

约定优于配置是一种软件设计的模式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。

SpringBoot就是约定优于配置这一理念下的产物,它类似于Spring框架下的一个脚手架,通过SpringBoot我们可以快速开发基于Spring生态下的应用程序。基于传统的Spring框架开发web应用,我们需要做很多和业务无关并且只需要做一个的配置,比如管理jar包依赖,web.xml,Dispatch-Servlet.xml,应用部署到web容器,第三方组件集成到SpringIoc容器中的配置项维护,而在SpringBoot中,我们不需要再去做这些繁琐的配置,SpringBoot已经自动帮我们完成了,这就是约定优于配置思想的体现。

体现:

  • SpringBoot starter启动依赖,它能帮我们管理所有的jar包版本。
  • SpringBoot的自动装配机制的实现,通过扫描约定路径下的spring.factories文件来识别配置类,实现Bean的自动装配。
  • 如果当前应用依赖了springmvc相关的jar,那么SpringBoot会自动内置Tomcat容器来运行web应用。
  • 默认加载的配置文件application.yml等等。

总结

等等,我还有句话要说,要记得做最灿烂的自己。