手写自己的Springboot-1-整合tomcat

news/2024/10/23 22:31:46/

文章目录

    • 创建自己的Springboot
      • 创建项目
      • 注册、启动Spring容器
      • 启动tomcat
    • 引用测试

创建自己的Springboot

首先明确本文章想要达到的目的,就是引入我们自己写的Springboot项目的依赖,无需配置,就可以达到处理普通请求的效果.

这里有一个非常简单的Springboot项目,项目里面就只有一个controller类

在这里插入图片描述

pom中就只引入了一个Springboot的依赖

在这里插入图片描述

当我们启动项目后,访问http://localhost:8080/test就可以得到返回结果.

在这里插入图片描述
那么我们想做的就是把这个依赖换成我们自己写的Springboot项目,也能达到同样的效果.

在这里插入图片描述
那Springboot帮我们做了哪些事情,就可以达到这样的效果呢? 这里其实主要有两件事情.

  1. 注册、启动Spring容器
  2. 启动tomcat

所以接下来,我们就会尝试去做这个东西,手写我们自己的Springboot.

创建项目

这里首先创建了一个Spring项目,因为Springboot肯定是依赖于Spring的.项目总体结构如下:
在这里插入图片描述

启动类BlingSpringApplication,将来使用方就是调用这个run方法去启动我们自己的Springboot的,只不过现在是空的.

在这里插入图片描述
这里也模仿Springboot去定义了一个注解,将来便于调用方进行标识使用.

在这里插入图片描述

pom如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.com.bling</groupId><artifactId>springboot</artifactId><version>1.0-SNAPSHOT</version><dependencies>
<!--        引入一些基础的spring依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.8.RELEASE</version></dependency><!--        servlet依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><!--        web容器依赖--><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>9.0.37</version></dependency><!--        <dependency>-->
<!--            <groupId>org.eclipse.jetty</groupId>-->
<!--            <artifactId>jetty-server</artifactId>-->
<!--            <version>9.4.51.v20230217</version>-->
<!--        </dependency>--></dependencies></project>

注册、启动Spring容器

建好了我们自己的Springboot项目,接下来就需要注册、启动Spring容器了.

其实代码很简单,只有三行.就写在我们的run方法里面.

这里需要注意一下,我们注册,启动Spring容器,需要传入一个类.这个类一般会是启动类.那为什么要传入一个类呢?

  • 其实最主要的就是为了能够解析到一个路径,我们知道springboot会默认扫描一个包路径,将这个包路径下面所有需要的bean都注册到spring容器中
    那这个路径是怎么确定的呢? 其实就是这个传入类所在的包路径.

    会解析这个传入类上的所有注解(包括注解上的注解),然后如果有ComponentScan注解的话,就会进行扫描注入.

public static void run(Class clazz) {//new 一个Spring容器对象AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();/*** 对spring进行注册,这里为什么要传入一个类?*    其实最主要的就是为了能够解析到一个路径,我们知道springboot会默认扫描一个包路径,将这个包路径下面所有需要的bean都注册到spring容器中*    那这个路径是怎么确定的呢? 其实就是这个传入类所在的包路径.*    会解析这个传入类上的所有注解(包括注解里的注解),然后如果有ComponentScan注解的话,就会进行处理 */applicationContext.register(clazz);//真正扫描路径,初始化bean的步骤applicationContext.refresh();}

启动tomcat

有了Spring容器,就可以启动tomcat了.

为什么要先初始化Spring容器呢?

因为tomcat作为一个servlet容器, 需要一个servlet.,在SpringMVC中,这个servlet是由DispatcherServlet来实现的,由它进行请求的分发,处理.

而DispatcherServlet是需要Spring容器的,因为tomcat启动后会将所有的请求交给DispatcherServlet去进行处理,DispatcherServlet拿到请求后会根据请求路径去spring容器中找到对应的bean,然后执行对应的方法,然后将结果进行返回.

public class BlingSpringApplication {public static void run(Class clazz) {//注册,启动Spring容器AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();/*** 对spring进行注册,这里为什么要传入一个类?*    其实最主要的就是为了能够解析到一个路径,我们知道springboot会默认扫描一个包路径,将这个包路径下面所有需要的bean都注册到spring容器中*    那这个路径是怎么确定的呢? 其实就是这个传入类所在的包路径.*    会解析这个传入类上的所有注解(包括注解里的注解),然后如果有CompantScan注解的话,就会进行处理*/applicationContext.register(clazz);//真正扫描路径,初始化bean的步骤applicationContext.refresh();//启动tomcatstartTomcat(applicationContext);}/*** 启动tomcat* @param applicationContext*/private static void startTomcat(AnnotationConfigWebApplicationContext applicationContext) {Tomcat tomcat = new Tomcat();Server server = tomcat.getServer();Service service = server.findService("Tomcat");//创建链接,绑定端口Connector connector = new Connector();connector.setPort(8080);StandardEngine standardEngine = new StandardEngine();standardEngine.setDefaultHost("localhost");StandardHost host = new StandardHost();host.setName("localhost");String contextPath = "";StandardContext context = new StandardContext();context.setPath(contextPath);context.addLifecycleListener(new Tomcat.FixContextListener());host.addChild(context);standardEngine.addChild(host);service.setContainer(standardEngine);service.addConnector(connector);/*** 最主要的一步,需要用到DispatcherServlet,这个是SpringMVC里面的,帮我们进行映射* 那DispatcherServlet接收到请求怎么处理的呢?*    DispatcherServlet需要一个applicationContext,也就是spring上下文*    tomcat启动后会将所有的请求交给DispatcherServlet去进行处理,DispatcherServlet拿到请求后会根据请求路径去spring上下文中*    找到对应的bean,然后执行对应的方法,然后将结果进行返回***/tomcat.addServlet(context,"dispatcher",new DispatcherServlet(applicationContext));context.addServletMappingDecoded("/*","dispatcher");try {tomcat.start();} catch (LifecycleException e) {e.printStackTrace();}}}

引用测试

现在我们就可以将自己的Springboot打包,发布到本地仓库,进行使用了.

  1. 替换成我们写的maven依赖

在这里插入图片描述
2. 替换成我们自己的注解和启动类.

在这里插入图片描述
其他保持不变,启动项目,看是否能达到我们想要的结果.

在这里插入图片描述
项目正常启动之后,进行访问. 发现确实可以正常访问.
在这里插入图片描述
至此,我们第一步就完成了,当然,目前是一个非常简单的小功能,还非常的不完善,比如说现在不想用tomcat了,想使用jetty,在Springboot中直接切换依赖就可以了,其他都不用动,就可以启动jetty了,那它又是怎样做到的呢?

这个将在后续的文章中不断揭秘.

今天的分享就到这里了,有问题可以在评论区留言,均会及时回复呀.
我是bling,未来不会太差,只要我们不要太懒就行, 咱们下期见.
在这里插入图片描述


http://www.ppmy.cn/news/63774.html

相关文章

对于零基础小白来说,转行学云计算和java哪个更好一些?求推荐

对于零基础小白来说&#xff0c;转行学云计算和java哪个更好一些&#xff1f; 云计算和Java是两个不同的技术领域&#xff0c;虽然它们都与计算机网络、分布式系统和互联网应用程序等相关&#xff0c;但它们的学习重点和应用场景也不同。虽然他们都是非常有前途的IT领域&#x…

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

二分查找&#xff1a; 题目链接&#xff1a;力扣 前提&#xff1a;数组为有序数组&#xff0c;且数组中无重复元素。 &#xff08;一旦有重复元素&#xff0c;则二分法返回的元素下标不可能唯一&#xff09; 二分法优势&#xff1a;时间复杂度O(logn) 注意要点&#xff1a;…

22-Django框架基础

1 实现更新书籍信息 更改原有的书籍信息也是经常用到的功能&#xff0c;比如价格的调动等&#xff0c;那么下面就来实现这个功能&#xff0c;首先还是编写模板层页面&#xff0c;在 templates/index 中新建 update_book.html 页面&#xff0c;代码所下所示&#xff1a; <!…

数据结构与算法十 并查集

一 并查集 并查集是一种树型的数据结构 &#xff0c;并查集可以高效地进行如下操作&#xff1a; 查询元素p和元素q是否属于同一组合并元素p和元素q所在的组 1.1 并查集结构 并查集也是一种树型结构&#xff0c;但这棵树跟我们之前讲的二叉树、红黑树、B树等都不一样&#xf…

C++好难(6):模板初阶

【本节目标】 1. 泛型编程2. 函数模板3. 类模板 目录 【本节目标】 1.泛型编程 2.函数模板 概念&#xff1a; 格式&#xff1a; 原理&#xff1a; 实例化&#xff1a; 1.隐式实例化&#xff1a; 2.显式实例化 原则一&#xff1a; 原则二&#xff1a; 原则三&#…

CentOS 7(2009) 升级 GCC 版本

1. 前言 CentOS 7 默认安装的 gcc 版本为 4.8&#xff0c;但是很多时候都会需要用到更高版本的 gcc 来编译源码&#xff0c;那么本文将会介绍如何在线升级 CentOS 的 gcc 版本。 2. 升级 GCC (1). 安装 centos-release-scl&#xff1b; [imaginemiraclecentos7 ~]$ sudo yum…

C语言:指针求解鸡兔同笼问题

题目&#xff1a;鸡兔同笼问题 要求&#xff1a;使用自定义函数void calc(int h, int f,int *c,int *r) 求解鸡兔同笼问题。 h 表示总的头数&#xff0c;f 表示总的脚数。 例子&#xff1a; 输入&#xff1a; 5 16 输出&#xff1a; 2 3 分析&#xff1a; 在该代码中&a…

即时通讯APP开发费用成本多少?

移动互联网的发展&#xff0c;为人们的通讯交流提供了非常多的便利&#xff0c;一些即时通讯APP的出现&#xff0c;将人与人的距离再一次缩短。通过即时通讯APP软件&#xff0c;人们可以随时随地了解身边发生的新鲜事物&#xff0c;以及和朋友探讨各类趣事&#xff0c;甚至可以…