SpringBoot简化操作的体现
SpringBoot可以简化Spring程序初始搭建过程和Spring程序的开发过程,省去spring的配置文件/配置类
的配置过程和pom.xml
文件中依赖的设置
起步依赖
: pom.xml文件中依赖配置的书写简化自动配置
: 简化常用工程中配置类或者配置文件中Bean的相关配置辅助功能
: 内置服务器
父工程parent(依赖版本)
传统模式的缺点
: 某个依赖的版本切换时容易发生依赖冲突问题
- 当使用Spring配合MyBatis开发时,如果Spring的版本发生变化需要切换时,MyBatis版本和其他关联技术的依赖版本也有可能也要跟着切换
SpringBoot关注到开发者在进行开发时,往往对依赖版本的选择具有固定的搭配格式,并且这些依赖版本的选择还不能乱搭配,否则会有依赖版本冲突问题
- SpringBoot将所有的技术版本的常见搭配方案都给开发者整理了出来,
不同的搭配方案对应SpringBoot中parent的不同版本
parent
只负责帮助开发者对依赖的版本进行统一管理,它不会帮你导入依赖的坐标,模块中需要什么依赖还是需要手动导入只是可以不用写依赖版本号了
<!--自己创建的SpringBoot项目继承的父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
</parent>
自己创建的SpringBoot项目继承的父工程spring-boot-starter-parent
的父工程spring-boot-dependencies
对项目的依赖版本进行了统一管理
依赖版本号属性
: 在properties
标签中使用标签(标签名任意)定义依赖的版本号,方便统一修改依赖的版本依赖坐标
: 在dependencyManagement
标签中对将来子工程
需要引用的依赖坐标进行管理且不会在当前父工程中引入依赖
<!--spring-boot-starter-paren工程还有父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.4</version>
</parent>
<!--spring-boot-dependencies工程定义了依赖的版本号属性-->
<properties>
<activemq.version>5.16.3</activemq.version>
<aspectj.version>1.9.7</aspectj.version>
<assertj.version>3.19.0</assertj.version>
<commons-codec.version>1.15</commons-codec.version>
<commons-dbcp2.version>2.8.0</commons-dbcp2.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<commons-pool.version>1.6</commons-pool.version>
<commons-pool2.version>2.9.0</commons-pool2.version>
<h2.version>1.4.200</h2.version>
<hibernate.version>5.4.32.Final</hibernate.version>
<hibernate-validator.version>6.2.0.Final</hibernate-validator.version>
<httpclient.version>4.5.13</httpclient.version>
<jackson-bom.version>2.12.4</jackson-bom.version>
<javax-jms.version>2.0.1</javax-jms.version>
<javax-json.version>1.1.4</javax-json.version>
<javax-websocket.version>1.1</javax-websocket.version>
<jetty-el.version>9.0.48</jetty-el.version>
<junit.version>4.13.2</junit.version>
</properties>
<!--引用定义的依赖版本属性值对依赖的版本进行管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
因为在Maven中继承机会只有一次
,我们可以直接在创建的SpringBoot工程中的pom文件中导入spring-boot-dependencies
,基于阿里云
的starter创建的工程就使用了此种形式
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
starter(依赖搭配)
SpringBoot关注到开发者对于依赖坐标的使用往往都有一些固定的组合方式,比如使用spring-webmvc(Spring和web整合依赖)
就一定要使用spring-web(web开发依赖)
SpringBoot把所有的技术使用的固定搭配格式都给开发出来,不同的固定搭配组合对应一个starter
,命名格式spring-boot-starter-技术名称
- 如果出现依赖的过量导入时可以通过maven中的
排除依赖语法
剔除掉一部分,当然如果不管它也没事
starter与parent
都是帮助我们简化配置
,但二者有一些区别
starter
: 在一个依赖坐标中定了若干个坐标,可以用来减少依赖配置的书写量parent
: 在pom.xml
文件定义了几百个依赖版本号,可以用来对依赖的版本进行统一管理,减少项目中的依赖版本冲突问题
实际开发中是如果需要用什么技术就去找这个技术对应的starter,如果有就直接写而且无需指定版本(版本由parent提供),如果没有再手写对应具体的坐标
实际开发中如果出现了依赖坐标冲突现象,确认你使用的可行的版本号,然后手动指定依赖的版本,这样就会覆盖SpringBoot提供给我们的配置管理
- 如果想要手动指定依赖的版本号我们可以直接在当前项目中的pom.xml文件中指定,或在
spring-boot-dependencies
工程中的依赖的properties
标签内指定
<properties>
<activemq.version>5.16.3</activemq.version>
<commons-dbcp2.version>2.8.0</commons-dbcp2.version>
</properties>
如果我们的项目中使用了SpringMVC技术
只需要添加spring-boot-starter-web
依赖
<!--在我们的项目中添加依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!---查看spring-boot-starter-web中包括的web技术相关的若干个具体依赖坐标-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.4</version>
<scope>compile</scope>
</dependency>
<!--Json技术相关的依赖坐标-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.5.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.5.4</version>
<scope>compile</scope>
</dependency>
<!--spring-webmvc的依赖坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.9</version>
<scope>compile</scope>
</dependency>
<!--spring整合web开发的依赖坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
<scope>compile</scope>
</dependency>
</dependencies>
使用SpringMVC开发时通常都会使用到解析JSON字符串和Java对象
相关的starter
<!--Json技术相关的依赖坐标-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.5.4</version>
<scope>compile</scope>
</dependency>
<!--查看spring-boot-starter-json中包含的相关依赖坐标-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.9</version>
<scope>compile</scope>
</dependency>
<!--JSON和Java对象相互转换的依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.12.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.12.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
<version>2.12.4</version>
<scope>compile</scope>
</dependency>
</dependencies>
引导类
在Spring程序中运行的基础是创建一个IoC容器
对象然后统一管理所有Bean,而启动类运行后就会产生这样一个容器对象
- 启动类上的
@SpringBootApplication
注解类似@Configuration
注解,表示把当前引导类看作一个配置类
@SpringBootApplication
public class QuickstartApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(QuickstartApplication.class, args);
BookController bean = ctx.getBean(BookController.class);
System.out.println("bean======>" + bean);
}
}
内嵌tomcat
既然你要做web程序肯定离不开使用web服务器,所以SpringBoot程序中提供了内置的web服务器(辅助功能),当导入spring-boot-starter-web
后就可以使用
内嵌的Tomcat的定义位置
: tomcat-embed-core
内嵌Tomcat运行原理
: Tomcat是一款使用java语言开发的软件,java程序运行靠的是对象,而tomcat服务器就是以对象的形式在Spring容器中运行的
<!--web相关的starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
||
||
||
<!--tomcat相关的stater-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.5.4</version>
<scope>compile</scope>
</dependency>
||
||
||
<dependencies>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
<scope>compile</scope>
</dependency>
<!--tomcat内嵌核心,Spring程序中运行的对象-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.52</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>tomcat-annotations-api</artifactId>
<groupId>org.apache.tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>9.0.52</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>9.0.52</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>tomcat-annotations-api</artifactId>
<groupId>org.apache.tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
通过依赖排除的方式去掉了tomcat相关的starter,相当于将tomat服务器对应的对象从Spring容器中去掉,此时程序中web服务器的功能就失效了
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
SpringBoot提供了3款内置的服务器,如果想要更换服务器
,需要先把当前内嵌的tomcat排除掉,然后加入对应服务器的依赖坐标
-
tomcat(默认)
:apache出品,粉丝多,应用面广,负载了若干较重的组件 -
jetty
:更轻量级但负载性能远不及tomcat -
undertow
:负载性能勉强跑赢tomcat
<!--jetty服务器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>