02-SpringBoot程序相对于Spring程序简化操作的4个体现

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>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值