springboot框架的设计目的是用来简化spring应用的初始搭建以及开发过程,
传统的web项目需要将程序打成war包,然后部署一个tomcat服务器才能运行,但是springboot程序集成了tomcat服务器,能够通过maven命令 mvn clean package打成jar包,只要将jar包下载到电脑然后 java -jar xxx.jar就能运行java程序
spring boot使得开发运行程序更加简单,程序启动更快,方便前端等非后端开发人员进行测试。
与spring相比,spring程序配置繁琐且依赖设置繁琐,而springboot程序能够实现自动配置和起步依赖(简化依赖配置),且集成了一些辅助功能例如内置tomcat服务器等
Springboot两大核心特性
一、我们知道 Spring Boot 能快速的搭建起一个应用,简化了大量的配置过程,这个原因就在于spring起步依赖的配置
以前我们开发一套spring程序需要进行非常多繁琐的配置:
- 配置 pom.xml 添加 Spring 、 Spring MVC 框架的依赖,同时还需要考虑这* 些不同的框架的不同版本是否存在不兼容的问题
- 配置 Web.xml,加载 Spring、Spring MVC
- 配置 Spring
- 配置 Spring MVC
- 编写业务逻辑代码
而springboot开发一个web应用,只需要配置:
- 配置 pom.xml 继承 Spring Boot 的 pom.xml ,添加 Web 起步依赖
- 创建启动引导类,编写业务代码
在当下,微服务非常火热,一个应用包含了几十甚至几百个服务,如果每个服务都需要将各种配置继承到spring中,那么将多了非常多的重复工作。
解决这个问题的方法就是用springboot实现配置,其最大优点就是简化了配置工作,以前配置需要配置web、mvc、mysql等等各种以及对应版本冲突,但现在只需要导入一个 spring-boot-starter-web即可,这个名为web的起步依赖里面集成了许多基本的依赖并且都已经做好了版本管理。
下图是 spring-boot-starter-web内部的一部分常用依赖,这些依赖都已经集成好了
在使用springboot的起步依赖之前,我们只需要在pom.xml继承springboot的配置模板,即让pom.xml继承springboot的pom.xml,而springboot的pom.xml里面定义了常用的框架以及响应的版本号,无需考虑不同框架的不同版本的冲突问题且简化了pom.xml的配置:
Maven的依赖书写遵循GAV的原则(Group、Artifact、version),springboot开发只需要写上G和A,V由boot的配置提供,如果发生了坐标的错误,再手动指定version解决冲突
注意,如果我们想要不使用springboot配置的某个类,我们可以用exclusion去掉某个组件
案例:比如我们在启动时不希望使用tomcat服务器而是使用jetty服务器,那么我们就在 spring-boot-starter-web里面去掉tomcat的依赖,并且在外面重新引入jetty的依赖
写好后用maven同步下项目后编译运行就会看到是用jetty服务器启动的
二、springboot自动配置
首先,我们知道springboot有一个启动类,这个类除了是整个应用的入口,而且发挥着配置spring的重要作用
启动类上面有一个SpringBootApplication注解,这个注解是已经封装好的,点进去会看到这个注解包含了很多其他注解,尤其注意SpringBootConfiguration就是之前的Configuration注解表示起到配置类的作用,ComponentScan表示扫描组件
这里,要重点说下上面的EnableAutoConfiguration注解,这个注解作用是开启springboot的自动配置,它同样发挥着多个注解的作用
点进去可以看到,它通过Import这个注解在IOC容器中引入了AutoConfigurationImportSelector这个组件
在AutoConfigurationImportSelector这个类中有一个getAutoConfigurationEntry的方法,它的作用是扫描classpath下的所有jar包的spring.factories文件, 将 spring.factories 文件 key 为 EnableAutoConfiguration 的所有值取出,然后这些值其实是类的全限定名, 也就是自动配置类的全限定名 ,然后 Spring Boot 通过这些全限定名进行类加载(反射),将这些自动配置类添加到 Spring 容器中。
接下来,我们打开外部库中一个叫做spring-boot-autoconfiguration.jar这个jar包,发现里面有一个名为EnableAutoConfiguration的键值对,这个键值对其实就是维护自动配置类的,包括一些web、AOP、redis等依赖的自动配置
我们点开其中的一个自动配置类HttpEncodingAutoConfiguration看看实现:
- 上面Configuration注解表示这个类是一个配置类,且不支持生成代理对象
- EnableConfiguration这个注解表示是 启 ConfigurationProperties 功能,也就是将配置文件和 HttpProperties.class 这个类绑定起来,将配置文件的相应的值和 HttpProperties.class 的变量关联起来
- ConditionalOnWebApplication表示只有在web应用下这个自动配置才会生效
- ConditionalOnClass表示只有里面的类存在这个自动配置类才会生效
- ConditionalOnProperty表示只有存在这个配置且其值为Enabled才会生效这个配置类
- 下面的方法返回值通过@Bean注解加入到容器中
