深入理解SpringBoot(二)——SpringBoot基本概念

时间:2022-10-09 11:29:26

2 SpringBoot基本概念

2.1 SpringBoot概述

说明:SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。

Spring缺点

  • 依赖设置繁琐
  • 配置繁琐

SpringBoot优点

  • 起步依赖(简化依赖配置)
  • 自动配置(简化常用工程相关配置)
  • 辅助功能(内置服务器)

2.2 parent

说明:在创建工程时,我们总是难免配置pom.xml文件,但不同项目的pom.xml可能所需的东西完全一样。以下面为例,project-a的pom.xml可能和project-b的pom.xml所需的配置依赖项完全一样;为此,springboot将所有项目开发需要的依赖全部提前写在同一个隐藏的project-dependencies的pom.xml中,并且在此之上生成了一个project-parent的pom.xml,该配置文件可以直接引用各种依赖的标签,并配置好了版本信息,版本的选择由Springboot源码负责人员来测量最稳定的依赖版本,这实际上大大改变了协同工作的效率,避免一群人开发一个项目时存在不同的依赖版本而去花费额外的开销去调整包的版本。

深入理解SpringBoot(二)——SpringBoot基本概念

在springboot工程中,我们可以点击pom.xml文件,可以发现该文件继承了parent对应的pom.xml文件,按ctrl并点击可以查看文件详情。

深入理解SpringBoot(二)——SpringBoot基本概念

进入后再次点击箭头所指位置,我们可以发现进入我们刚刚所说的project-dependencies的pom.xml中。

深入理解SpringBoot(二)——SpringBoot基本概念

如果你不适用官方测定的版本,而改用自己选定的版本,那么你需要继承parent模块,这样可以保证该依赖版本对应的其他依赖的版本会全部发生变动,使得所有的依赖不会发生版本冲突。

实际应用:当我们使用坐标时,仅书写pom.xml所需的GAV中的GA,而V(version)由springboot提供;如果springboot未提供对应版本的v或者没有项目所需的依赖坐标,则会发生坐标错误,此时在注意各个依赖版本冲突的情况下,再去指定version即可。


2.3 starter

说明:从项目中的pom.xml文件中我们可以发现一个名为spring-starter_test的依赖。

深入理解SpringBoot(二)——SpringBoot基本概念

该依赖可以按ctrl点击进去查看,可以发现,他帮我们导入了若干个依赖项,这些依赖项都是SpringWeb项目所需的启动依赖项,如tomcat、mvc、web等依赖项。简而言之,我们称这种为“牵一发而动全身”,当导入了一个starter依赖,则项目所需的所有依赖都会被导入。

深入理解SpringBoot(二)——SpringBoot基本概念


2.4 引导类

说明:在创建项目的时候,我们发现了这么一个类,该类我们称之为引导类

深入理解SpringBoot(二)——SpringBoot基本概念

众所周知,SpringBoot本质上是Spring的简化实现,也就是说,Spring该有的它都有;在Spring的学习过程中,我们知道有一个IOC容器用户管理对象,也就是bean,那么它在SpringBoot中是通过什么来体现的呢?就是通过引导类。

让我们重新改变一下引导类里面的代码,我们居然惊讶地发现,它能够返回一个applicationContext对象,这意味着等号右边的部分相当于做了SpringIOC的工作;也就是说,通过返回的对象,我们可以实现springIOC中getBean等方法去获取bean。

package springboot_01_01_quickstart;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Springboot0101QuickstartApplication {

    public static void main(String[] args) {

        ApplicationContext applicationContext = SpringApplication.run(Springboot0101QuickstartApplication.class, args);
    }

}

可在引导类并没有写获取bean的代码,它是如何获取bean的?这全都依赖于SpringBootApplication注解。

让我们查看注解的内容,使用ctrl+点击查看注解。我们发现其源码中出现这么一个注解:ComponentScan(扫描组件,即扫描bean)。好了破案了,实际上并不需要我们手动使用getBean来获取bean,Springboot在我们没有指定bean的情况下,它会自动扫描bean,该扫描的范围是引导类所在的目录下的所有内容。

深入理解SpringBoot(二)——SpringBoot基本概念

springBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目,SpringBoot工程运行后初始化Spring容器,扫描引导类所在包下的所有内容来加载bean。


2.5 内嵌tomcat

引入:在tomcat的文章中我们提到过,如果想要启动一个tomcat,必须采用run maven的形式或者打开tomcat安装目录的startup.bat文件来启动服务器,但在Boot工程中却没有类似的操作情况,这是怎么回事?

说明:在pom.xml的starter依赖中的tomcat依赖中我们可以发现这么一件事:Boot工程中内嵌了一个tomcat容器。

深入理解SpringBoot(二)——SpringBoot基本概念

SpringBoot将tomcat的核心代码嵌入到工程中,tomcat的操作对象交给了SpringBoot工程来进行管理。

拓展:实际上除了Tomcat服务器,后来还出现了Jetty服务器,其相对于Tomcat来说可扩展性更强。现如今,谷歌应用引擎已经全面将tomcat替换为jetty。tomcat中除了内置tomcat和jetty,还内置了undertow。tomcat是apache出品,粉丝多,应用面广,负载了若干较重的组件;jetty虽然更轻量,但负载性能远不及tomcat;undertow负载性能勉强跑赢tomcat,但没必要为了这点差别去放弃tomcat。