Spring boot入门工程

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注解加入到容器中
相关推荐
岁忧8 分钟前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
Java初学者小白12 分钟前
秋招Day14 - Redis - 应用
java·数据库·redis·缓存
代码老y18 分钟前
Spring Boot + 本地部署大模型实现:优化与性能提升
java·spring boot·后端
GodKeyNet22 分钟前
设计模式-桥接模式
java·设计模式·桥接模式
guojl1 小时前
营销画像客群架构
后端
guojl1 小时前
Java多任务编排技术
java
为神敬酒者1 小时前
从银行转账实践理解互斥和同步
后端
丶意冷1 小时前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
要开心吖ZSH2 小时前
《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
java·分布式·spring
桦说编程2 小时前
深入解析CompletableFuture源码实现
java·性能优化·源码