Spring Boot运行原理及功能实现方式

简介: Spring Boot运行原理及功能实现方式

前言

快速入门程序编写完了,我们发现springBoot程序开发比spring程序编写起来容易的多。配置简洁,依赖关系简单,启动运行容易。那么结下了我们我们就要思考一下入门程序中的这些功能是怎么实现的。

接下来我们从以下几个方面研究:


SpringBoot的启动依赖

启动器starter有什么作用

启动引导类是怎么运行的

内置的tomcat服务器原理

pom.xml文件分析

我们应用配置第一个就是依赖,这个依赖的作用到底是什么我们仔细来分析一下。


项目中的pom.xml中继承了一个坐标

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

注意:这里parent的坐标被工程继承了,相当于这是一个父类,我们创建的工程是一个子类,用到了父类的东西。


打开spring-boot-starter-parent之后,发现他又继承了一个坐标。

image.png


继续打开spring-boot-dependencies之后,发现该文件中主要定义了两组信息,分别是各种依赖的版本号和所有依赖的坐标信息,并对声明的版本号做了一个引用。我们打开发现这里有两千多行,所有能配置的版本基本都包含了。

image.png


由于Spring Boot工程使用到了maven的聚合工程,所以这里我们可以认为spring-boot-dependencies就是父工程,子工程就是我们自己的项目。当我们子工程中使用<parent>继承父类之后,所有的版本就都由父类决定了。

image.png


可以看到子工程当中我们没有声明版本号,是因为所有的版本都由父类决定,这样做的好处是什么:解决了版本冲突。不同模块、不同功能之间使用的版本是不一样的,因此spring boot就为我们将所有的版本统一化了。


启动器starter

SpringBoot官方给出了好多个starter的定义,方便我们使用,而且名称都是如下格式

命名规则: spring-boot-starter-技术名称


starter定义了使用某种技术时对于依赖的固定搭配格式,也是一种最佳解决方案,使用starter可以帮助开发者减少依赖配置


项目中的pom.xml定义了使用springMVC技术,但是并没有写SpringMVC的坐标,而是添加了一个名字中包含starter的依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

在spring-boot-starter-web中又定义了若干个具体依赖的坐标

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.7.3</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-json</artifactId>
    <version>2.7.3</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>2.7.3</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.3.22</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.22</version>
    <scope>compile</scope>
  </dependency>
</dependencies>

然后你可以继续打开任意一个依赖,发现里面又会包含一些依赖。

我们可以发现,这个starter中又包含了若干个坐标,其实就是使用SpringMVC开发通常都会使用到Json,使用json又离不开这里面定义的这些坐标,看来还真是方便,SpringBoot把我们开发中使用的东西能用到的都给提前做好了。你仔细看完会发现,里面有一些你没用过的。的确会出现这种过量导入的可能性,没关系,可以通过maven中的排除依赖剔除掉一部分。不过你不管它也没事,大不了就是过量导入呗。


总结:

使用starter可以帮开发者快速配置依赖关系。以前写依赖3个坐标的,现在写导入一个就搞定了,就是加速依赖配置的。


启动引导类

目前程序运行的入口就是SpringBoot工程创建时自带的那个类了,带有main方法的那个类,运行这个类就可以启动springBoot工程的运行

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Spring Boot本身就是为了加速Spring程序而开发的,而Spring程序运行的基础是需要创建自己的Spring容器对象,并将所有的对象管理在容器里面,这时候你可能会疑惑,Spring boot加速了Spring程序,那spring boot中有没有容器呢,或者说这个容器还存在吗?答案是存在,我们可以修改上面的代码来验证一下。

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
        Application bean = context.getBean(Application.class);
        System.out.println(bean);
    }
}

这里的ConfigurableApplicationContext继承了ApplicationContext,说明他就是一个容器,拿到容器之后再通过getBean()来拿到bean,打印在控制台。


image.png


可以看到控制台打印出来了对应的地址,说明它就是c从容器中拿到的一个对象,说明spring boot中存在一个容器,而SpringApplication.run(Application.class, args);就是运行Spring Boot容器,


@SpringBootApplication注解

接下来我们看一下@SpringBootApplication注解


image.png


根据箭头打开注解可以看到有Spring Boot配置以及自动配置,自动配置包等等,因此当程序加了@SpringBootApplication注解,他就会扫描这个类所在包下和子包下面的所有类。并且他还是spring boot的配置类,所以spring的一些配置文件就不用写了,配置类自动搞定了。


总结一下:这个启动引导类,创建了一个容器并将该容器运行起来,做了一个配置类,里面有一些自动配置的东西,然后我们创建的对象就可以放在引导类的包以及子包中,就可以扫描到了。


内置的服务器

我们在创建spring boot项目时,会勾选需要的依赖,然后导入对应的starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

内置的tomcat服务器来研究几个问题


这个服务器在什么位置定义的

这个服务器是怎么运行的

这个服务器如果想换怎么换

内嵌Tomcat定义位置

说到定义的位置,我们可以通过两种方式来查看:


第一种

image.png


第二种

image.png


tomcat运行原理

tomcat本身就是一个Java项目,那么可不可以将tomcat中的一些东西直接放回项目中,让他变成一个Java代码?


当然可以,这里spring boot将tomcat以jar包的形式放到spring容器中让他变成一种对象,然后运行这个对象,把我们的项目启动起来,这就是它能够启动并且运行的原理。


修改服务器

如果我们不想用他提供的版本能不能修改呢?可以,我们可以通过<exclusions>标签来排除提供的版本,或者内置服务器,然后在再重新添加依赖来达到修改服务器版本或者更换服务器的目的。

<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>

image.png

当添加<exclusions>标签之后,就把内置的tomcat的服务器排除了,这时候你在启动项目,在控制台就不会看到tomcat相关的信息了,并且网页也无法访问了。


添加服务器

这时候你再添加你想要的使用的服务器,只需添加对应的坐标即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

image.png


同样在控制台就会看到服务器相关的信息了,并且网页也可以正常访问了。不过这样就显得有点多此一举了,好好的东西不用,非要自己搞这些,所以还是建议使用内置的服务器。


更换内嵌服务器

那我们是否可以换个服务器呢?必须的嘛。根据SpringBoot的工作机制,用什么技术,加入什么依赖就行了。SpringBoot提供了3款内置的服务器


tomcat(默认): apache出品,粉丝多,应用面广,负载了若干较重的组件

jetty:更轻量级,负载性能远不及tomcat

undertow:负载性能勉强跑赢tomcatI

想用哪个,加个坐标就OK。前提是把tomcat排除掉,因为tomcat是默认加载的。

<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>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

现在就已经成功替换了web服务器,它的核心思想就是加入对应的坐标就可以了。

目录
打赏
0
0
0
0
87
分享
相关文章
springboot自动配置原理
Spring Boot 自动配置原理:通过 `@EnableAutoConfiguration` 开启自动配置,扫描 `META-INF/spring.factories` 下的配置类,省去手动编写配置文件。使用 `@ConditionalXXX` 注解判断配置类是否生效,导入对应的 starter 后自动配置生效。通过 `@EnableConfigurationProperties` 加载配置属性,默认值与配置文件中的值结合使用。总结来说,Spring Boot 通过这些机制简化了开发配置流程,提升了开发效率。
37 17
springboot自动配置原理
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
49 0
|
10天前
|
SpringBoot整合XXL-JOB【04】- 以GLUE模式运行与执行器负载均衡策略
在本节中,我们将介绍XXL-JOB的GLUE模式和集群模式下的路由策略。GLUE模式允许直接在线上改造方法为定时任务,无需重新部署。通过一个测试方法,展示了如何在调度中心配置并使用GLUE模式执行定时任务。接着,我们探讨了多实例环境下的负载均衡策略,确保任务不会重复执行,并可通过修改路由策略(如轮训)实现任务在多个实例间的均衡分配。最后,总结了GLUE模式和负载均衡策略的应用,帮助读者更深入理解XXL-JOB的使用。
24 9
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
112 14
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
springboot自动配置原理
启动类@SpringbootApplication注解下,有三个关键注解 (1)@springbootConfiguration:表示启动类是一个自动配置类 (2)@CompontScan:扫描启动类所在包外的组件到容器中 (3)@EnableConfigutarion:最关键的一个注解,他拥有两个子注解,其中@AutoConfigurationpackageu会将启动类所在包下的所有组件到容器中,@Import会导入一个自动配置文件选择器,他会去加载META_INF目录下的spring.factories文件,这个文件中存放很大自动配置类的全类名,这些类会根据元注解的装配条件生效,生效
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
57 3
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
88 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等