【第二篇】 初步解析Spring Boot

简介

SpringBoot是由Pivotal团队提供的全新框架,其设计目的是为了用来简化Spring应用的初始搭建以及开发过程的。本文章将详细介绍SpringBoot为什么能够简化项目的搭建以及普通的Spring程序的开发。文章内容若存在错误或需改进的地方,欢迎大家指正!若对操作有任何疑问欢迎留言!非常感谢!

目录

一、使用parent控制版本

1、场景

2、解决

3、详解

二、starter简化依赖引入

1、场景

2、解决

3、详解

三、引导类启动容器并加载Bean

1、详解

2、案例

四、辅助功能(内嵌服务器)

1、场景

2、解决

3、详解

4、更换内嵌服务器


一、使用parent控制版本

1、场景

在项目中需要使用什么技术,那么就在pom文件中导入对应的坐标即可。但是,在不同的项目中是有可能使用到相同的技术的,那么就需要导入相同的依赖,这样的话就有可能出现两个项目导入的依赖的版本不同的情况,就会出现依赖冲突的问题。

2、解决

SpringBoot通过使用Maven的dependencyManagement管理了大量的常用依赖的版本,然后项目在引入spring-boot-starter-parent坐标之后由于Maven依赖传递的机制,需要使用其他常用技术而引入依赖时就无需在指定当前技术依赖的版本,只需要关注groupId和artifactId即可 。由此便解决了大部分包冲突问题,但是所有的依赖SpringBoot中并不是都有收录,若引入未收录的依赖时还是需要指定版本的,所以也是存在依赖冲突的风险。

3、详解

【Spring源】

通过Spring官网创建的项目(不论是在官网上创建下载的zip包,还是在IDEA创建的时候源选择的是Spring官网),可以在项目的pom文件中看到有spring-boot-starter-parent的坐标,追进去之后可以看到又引入了spring-boot-dependencies的坐标,继续追进去,此时就可以看到SpringBoot管理的大量的常用的依赖的版本,这些版本通过Maven的依赖传递而使得项目在使用的时候不必再关注版本。

注:当SpringBoot的版本不一样的时候,管理的常用依赖的版本是可能不同的。

【阿里云源】

通过阿里云源创建的项目,可以在项目的pom文件中看到直接引入了spring-boot-dependencies坐标,也是一样的管理版本的效果。

二、starter简化依赖引入

以需要开发Web项目举例

1、场景

普通的Spring项目开发Web项目时需要用到spring-webmvc、spring-web、tomcat等核心技术,那么就需要引入对应的依赖,在引入tomcat技术时,又需要tomcat-embed-core、org.apache.tomcat等核心技术,那么还需要导入大量的包,就这样层层依赖,需要导入大量的依赖,导致项目依赖及其繁重不好管理。

2、解决

在SpringBoot中通过starter定义了常见项目所使用的所有依赖坐标,以达到减少依赖配置的目的,使开发者能够只专注于使用技术开发,而不过度关心技术依赖。从而达到简化依赖配置的目的。

3、详解

以Web技术为例,SpringBoot提供了spring-boot-starter-web依赖,当前一个依赖中就已经将该技术所依赖的全部依赖以引入,可参考下图,所以开发者只需要在项目中引入这一个依赖即可开始Web项目的开发。并且,SpringBoot还管理了该依赖的版本,所以也无需担心依赖冲突的问题。

三、引导类启动容器并加载Bean

1、详解

在Spring Boot项目中,被@SpringBootApplication注解标记的类被称为引导类(Main Class),它是整个Spring Boot应用的启动入口和核心配置中心。

  • 创建并初始化 ApplicationContext(Spring IoC容器)
  • 加载所有Bean定义(通过自动配置和组件扫描)(默认扫描当前类所在包及其子包)
  • 启动内嵌Web服务器(如Tomcat/Jetty,若为Web应用)
  • 引导类的类名可以自定义,run方法中接收的参数与类名保持一致即可

2、案例

在案例中可以看到run的方法的返回值是ConfigurableApplicationContext接口类型的对象,ConfigurableApplicationContext接口继承了核心容器接口ApplicationContext,所以ConfigurableApplicationContext接口对象也是可以直接获取Bean的。

四、辅助功能(内嵌服务器)

1、场景

传统模式部署服务需要独立安装、配置Tomcat服务器,手动维护server.xml文件,测试还需依赖外部环境,需要war包部署,启动慢,多环境配置还极其复杂。

2、解决

SpringBoot通过内嵌Tomcat服务做到零安装,依赖及服务,属性文件配置与应用代码一体化,无需额外手动维护,并且是可执行jar包,秒级启动,而且同一jar跨环境运行无差异。

3、详解

在spring-boot-starter-web坐标中引入了spring-boot-starter-tomcat起步依赖,而在这个起步依赖中引入了tomcat-embed-core嵌入核心依赖,于是Tomcat的jar包就被引入项目中。

Tomcat服务器是由Java语言编写,然后通过起步依赖引入了Tomcat的jar包,既然如此Tomcat也是能够被当作Bean的,于是SpringBoot就将Tomcat的执行过程抽取成一个对象,并将这个对象交给Spring的IOC容器管理,最终SpringBoot完成了对Tomcat的内嵌。

4、更换内嵌服务器

SpingBoot中共内嵌了三款服务器

  • tomcat(默认):apache出品,应用面广,负载了若干较重的组件
  • jetty:更轻量级,可扩展性更强,负载性能远不及tomcat。若小型应用,对tomcat依赖较小,则考虑。
  • undertow(了解):负载性能勉强跑赢tomcat

既然Tomcat服务器是通过Maven依赖引入的,那么同理也是可以被排除的。在spring-boot-starter-web的依赖坐标中使用exclusion对tomcat即可进行依赖排除。

【刷新Maven之前】

【刷新Maven之后】

以jetty服务器举例,只需要jetty的Spring起步依赖即可

启动服务,查看控制台。这里额外获取了jetty,可以看到jetty可以正常获取,而tomcat的Bean已经不存在了。

相关推荐
Hello World......1 小时前
Java求职面试揭秘:从Spring到微服务的技术挑战
大数据·hadoop·spring boot·微服务·spark·java面试·互联网大厂
Hello World......1 小时前
互联网大厂Java面试:从Spring到微服务的全面探讨
java·spring boot·spring cloud·微服务·面试·技术栈·互联网大厂
拾贰_C2 小时前
【SpringBoot】MyBatisPlus(MP | 分页查询操作
java·spring boot·后端·spring·maven·apache·intellij-idea
猛踹瘸子那条好腿の2 小时前
Spring-boot初次使用
java·springboot
我不是程序猿儿4 小时前
【C#】 lock 关键字
java·开发语言·c#
Uranus^5 小时前
深入解析Spring Boot与JUnit 5的集成测试实践
spring boot·单元测试·集成测试·junit 5·mockito
tmacfrank5 小时前
网络编程中的直接内存与零拷贝
java·linux·网络
weixin_472339466 小时前
Maven 下载安装与配置教程
java·maven
Magnum Lehar7 小时前
3d游戏引擎EngineTest的系统实现3
java·开发语言·游戏引擎
就叫飞六吧7 小时前
Spring Security 集成指南:避免 CORS 跨域问题
java·后端·spring