SpringBoot到底是什么?如何理解parent、starter、引导类以及内嵌Tomcat?(二)

简介: SpringBoot到底是什么?如何理解parent、starter、引导类以及内嵌Tomcat?(二)

六、starter与parent的区别

朦朦胧胧中感觉starter与parent好像都是帮助我们简化配置的,但是功能又不一样:


starter是一个坐标中定了若干个坐标,以前写多个的,现在写一个,是用来减少依赖配置的书写量的


parent是定义了几百个依赖版本号,以前写依赖需要自己手工控制版本,现在由SpringBoot统一管理,这样就不存在版本冲突了,是用来减少依赖冲突的


温馨提示


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


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


七、引导类介绍

配置说完了,我们发现SpringBoot确实帮助我们减少了很多配置工作,下面说一下程序是如何运行的。目前程序运行的入口就是SpringBoot工程创建时自带的那个类了,带有main方法的那个类,运行这个类就可以启动SpringBoot工程的运行,我的是这个:


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


写代码测试一下,先创建一个User类,把它放在容器中


@Component
public class User {
}


然后再写一个BookController类,也把它放在容器中


@RestController
@RequestMapping("/books")
public class BookController {
    @GetMapping("/getBooks")
    public String getBooks() {
        System.out.println("springboot程序正在运行呢~");
        return "Hello,SpringBoot is running";
    }
}


看看我对应类的目录结构:

image.png

最后写代码测试一下:


@SpringBootApplication
public class Springboot0101Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext
                = SpringApplication.run(Springboot0101Application.class, args);
        BookController bookBean = applicationContext.getBean(BookController.class);
        System.out.println("The message of bookBean : " + bookBean);
        User userBean = applicationContext.getBean(User.class);
        System.out.println("The message of userBean : " + userBean);
    }
}


运行结果:

image.png

看到结果,小伙伴们不难猜想了——SpringBoot程序启动是创建了一个Spring容器对象吧?答案就是如此!


Springboot0101Application这个类在SpringBoot程序中是所有功能的入口,称这个类为引导类。


作为一个引导类最典型的特征就是当前类上方声明了一个注解@SpringBootApplication


点击进入@SpringBootApplication,我们可以看到:

image.png

这里面有我们之前学习SSM时用到的包扫描注解,再点击进入@SpringBootConfiguration内:

image.png

我们可以发现,它最终使用了@Configuration注解,所以,归根到底,我们使用的引用类,也是一个配置类。


八、内嵌Tomcat

1、Tomcat定义位置

程序现在已经运行了,通过引导类的main方法运行了起来。但是运行java程序不应该是执行完就结束了吗?但是我们现在明显是启动了一个web服务器啊,不然网页怎么能正常访问呢?这个服务器是在哪里写的呢?


认真想一想,它就在我们引入的spring-boot-starter-web场景starter中,我们打开它来看一看:

image.png

这里面有一个核心的坐标,tomcat-embed-core,叫做tomcat内嵌核心。就是这个东西把tomcat功能引入到了我们的程序中。

image.png


2、Tomcat运行原理

再来说第二个问题,这个服务器是怎么运行的?


Tomcat服务器是一款软件,而且是一款使用java语言开发的软件,既然是使用java语言开发的,运行的时候肯定符合java程序运行的原理,java程序运行靠的是什么?对象呀,一切皆对象,万物皆对象。那tomcat运行起来呢?也是对象。


如果是对象,那Spring容器是用来管理对象的,这个对象能不能交给Spring容器管理呢?答案是可以的!tomcat服务器运行其实是以对象的形式在Spring容器中运行的,怪不得我们没有安装这个tomcat,而且还能用。闹了白天这东西最后是以一个对象的形式存在,保存在Spring容器中悄悄运行的。具体运行的是什么呢?其实就是上前面提到的那个tomcat内嵌核心


具体内嵌核心依赖如下:


<dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-core</artifactId>
      <version>9.0.58</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <artifactId>tomcat-annotations-api</artifactId>
          <groupId>org.apache.tomcat</groupId>
        </exclusion>
      </exclusions>
</dependency>


3、更换内嵌Tomcat

那既然是个对象,如果把这个对象从Spring容器中去掉是不是就没有web服务器的功能呢?当然可以,通过依赖排除可以去掉这个web服务器功能。根据SpringBoot的工作机制,用什么技术,加入什么依赖就行了。我选择的是SpringBoot提供的内置服务器jetty


更换代码如下:


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


让我们运行一下看看是什么样的结果:

image.png

输出结果是没有问题的,但是服务器就不是默认的Tomcat了,而是我选择的jetty服务器


九、小结

SpringBoot极大的简化了开发的步骤,我们要熟练使用。博主正在积极准备SpringBoot工程的具体细节相关的博客文章,喜欢的话,可以给博主一个赞哦~~


相关文章
|
14天前
|
前端开发 Java 应用服务中间件
从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?
该文是一系列关于从零开始手写实现 Apache Tomcat 的教程概述。作者希望通过亲自动手实践理解 Tomcat 的核心机制。文章讨论了 Spring Boot 如何实现直接通过 `main` 方法启动,Spring 与 Tomcat 容器的集成方式,以及两者生命周期的同步原理。文中还提出了实现 Tomcat 的启发,强调在设计启动流程时确保资源的正确加载和初始化。最后提到了一个名为 mini-cat(嗅虎)的简易 Tomcat 实现项目,开源于 [GitHub](https://github.com/houbb/minicat)。
|
1月前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置
|
14天前
|
自然语言处理 Java 应用服务中间件
从零手写实现 tomcat-09-servlet 处理类
该文是一个关于手写实现 Apache Tomcat 简化版的系列教程摘要。作者希望通过亲自实现一个简单的 Tomcat,来深入理解其工作原理。系列教程包括了从入门介绍到解析处理 WAR 包、与 SpringBoot 集成等多个步骤。文章介绍了 Servlet 的概念,将其比作餐厅服务员,负责处理网络请求和响应。文中还详细阐述了 Servlet 的处理流程,并通过实例解释了如何实现一个基础的 Servlet。最后,提到了如何根据请求 URL 进行调度和处理,并给出了迷你版 Tomcat(Mini-Cat)的开源地址。
|
14天前
|
前端开发 Java 应用服务中间件
从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?
本文探讨了Spring Boot如何实现像普通Java程序一样通过main方法启动,关键在于Spring Boot的自动配置、内嵌Servlet容器(如Tomcat)以及`SpringApplication`类。Spring与Tomcat集成有两种方式:独立模式和嵌入式模式,两者通过Servlet规范、Spring MVC协同工作。Spring和Tomcat的生命周期同步涉及启动、运行和关闭阶段,通过事件和监听器实现。文章鼓励读者从实现Tomcat中学习资源管理和生命周期管理。此外,推荐了Netty权威指南系列文章,并提到了一个名为mini-cat的简易Tomcat实现项目。
|
11天前
|
存储 Java 应用服务中间件
Springboot项目打war包部署到外置tomcat容器【详解版】
该文介绍了将Spring Boot应用改为war包并在外部Tomcat中部署的步骤:1) 修改pom.xml打包方式为war;2) 排除内置Tomcat依赖;3) 创建`ServletInitializer`类继承`SpringBootServletInitializer`;4) build部分需指定`finalName`;5) 使用`mvn clean package`打包,将war包放入外部Tomcat的webapps目录,通过startup脚本启动Tomcat并访问应用。注意,应用访问路径和静态资源引用需包含war包名。
|
23天前
|
前端开发 Java 应用服务中间件
springboot 升级(1.5.7.RELEASE升级到2.7.10) Tomcat启动报错
springboot 升级(1.5.7.RELEASE升级到2.7.10) Tomcat启动报错
|
1月前
|
XML Java 应用服务中间件
Springboot中tomcat配置、三大组件配置、拦截器配置
Springboot中tomcat配置、三大组件配置、拦截器配置
|
1月前
|
Java Spring
springboot单类集中定义线程池
该内容是关于Spring中异步任务的配置和使用步骤。首先,在启动类添加`@EnableAsync`注解开启异步支持。然后,自定义线程池类`EventThreadPool`,设置核心和最大线程数、存活时间等参数。接着,将线程池bean注入到Spring中,如`@Bean(&quot;RewardThreadPool&quot;)`。最后,在需要异步执行的方法上使用`@Async`注解,例如在一个定时任务类中,使用`@Scheduled(cron = &quot;...&quot;)`和`@Async`结合实现异步定时任务。
18 2
|
1月前
|
Java 应用服务中间件
Springboot启动的时候初始化的线程池默认配置tomcat
Springboot启动的时候初始化的线程池默认配置tomcat
16 1
|
16天前
|
XML Java 应用服务中间件
Tomcat_servlet部署、编译、配置、打包
Tomcat_servlet部署、编译、配置、打包
21 0