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注解加入到容器中
相关推荐
后台模板学习12 分钟前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one12 分钟前
算法--构造
java·数据结构·算法
SL_staff26 分钟前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
IT规划师44 分钟前
编程术语中的同步与异步:从"等不等"到工程取舍
后端·面试
SL_staff1 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
孟陬2 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
GoGeekBaird2 小时前
别再给每个 AI 做自我介绍了:我做了一个「个人上下文」管理系统
后端·github·agent
码事漫谈2 小时前
腾讯混元 Hy4 正式版发布了
后端
Mikko72 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.2 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测