文章目录
- 一、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的启动类注解,它是一个复核注解,里面包含
- @SpringBootConfiguration:该注解上有一个@Configuration注解,表示这个SpringBoot启动类是一个配置类,最终要被注入到spring容器中
-
@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启动流程
- 加载配置文件获取所有实现SpringApplicationRunListener这个接口的监听器调用监听器中的starting方法
- 准备上下文环境
- 创建上下文环境
- 设置完环境变量会调用监听器的相关方法
- 进入到spring启动容器的方法servletWebServerApplicationContext类下的refresh方法
- 调用监听器的started方法
- 计算springboot启动时间
- 执行监听器的ready方法
- 启动完成
六、SpringBoot扫描流程
- 调用run方法中的refreshContext方法
- 调用AbstractApplication中的refresh方法
- 委托给invokeBeanFactoryPostProcessors去处理调用链
- 其中一个方法postProcessBeanDefinitionRegistry会去调用processConfigBeanDefinitions解析beandefinitions
- 在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等等。
总结
等等,我还有句话要说,要记得做最灿烂的自己。