實現SpringBoot底層機制【Tomcat啟動分析+Spring容器初始化+Tomcat 如何關聯 Spring容器】

下載地址:?https://download.csdn.net/download/2401_83418369/90675207

一、搭建環境?

創建新項目

在pom.xml文件中導入依賴?(一定要刷新Maven)排除內嵌的Tomcat,引入自己指定的Tomcat

<?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>com.study</groupId><artifactId>hsp-SpringBoot</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!--    導入springboot父工程--><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.5.3</version></parent><!--    導入web項目場景啟動器:會自動導入和web開發相關的所有依賴--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
<!--            排除內嵌的Tomcat--><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><!--        引入指定的Tomcat--><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>8.5.75</version></dependency></dependencies></project>

實現任務階段1-創建Tomcat,并啟動

創建HspSpringApplication類作為啟動springboot的程序?

package com.study.hspSpringboot;import org.apache.catalina.startup.Tomcat;/*** 該類相當于是一個springboot啟動程序*/
public class HspSpringApplication {//這里會創建Tomcat關聯Spring容器public static void run(){try {//創建TomcatTomcat tomcat = new Tomcat();//設置端口tomcat.setPort(9090);//啟動tomcat.start();//等待請求接入System.out.println("======等待連接======");tomcat.getServer().await();} catch (Exception e) {throw new RuntimeException(e);}}
}

創建HspMainApp作為主程序?

package com.study.hspSpringboot;public class HspMainApp {public static void main(String[] args) {HspSpringApplication.run();}
}

當啟動springboot程序時,通過netstat -anb命令查詢得到?

創建一個Bean,一個控制器和一個配置類?

Bean對象?

hspConfig類?

package com.study.hspSpringboot.Config;import com.study.hspSpringboot.bean.Monster;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;/*** @Configuration表示這個類是一個配置類,* @ComponentScan("com.study.hspSpringboot")表示要springboot要掃描的路徑*/
@Configuration
@ComponentScan("com.study.hspSpringboot")
public class hspConfig {@Beanpublic Monster monster(){return new Monster();}
}

HiController類?

package com.study.hspSpringboot.Controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @RestController這個注解表示一個Controller控制器,* 也包含@ResponseBody注解的作用(將響應的對象轉成json格式的字符串)**/
@RestController
public class HiController {@RequestMapping("/hi")public String hi(){return "hi";}
}

實現任務階段2-創建Spring容器?并關聯Tomcat

創建HspWebApplicationInitializer 類充當容器對象

package com.study.hspSpringboot;import com.study.hspSpringboot.Config.hspConfig;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;/*** 該類是一個Spring容器,完成Bean的創建和依賴注入,前端控制器的分發*/
public class HspWebApplicationInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletContext) throws ServletException {//創建容器對象AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext =new AnnotationConfigWebApplicationContext();//將配置類進行注冊到容器(這樣才能使配置類的@ComponentScan注解生效,這樣才能掃描其它的注解注入到容器)annotationConfigWebApplicationContext.register(hspConfig.class);//刷新容器(初始化容器,創建Bean對象,注入依賴)annotationConfigWebApplicationContext.refresh();//創建前端控制器,持有容器DispatcherServlet dispatcherServlet =new DispatcherServlet(annotationConfigWebApplicationContext);//將servlet交給servletContext管理(類似web.xml文件中配置servlet)ServletRegistration.Dynamic app =servletContext.addServlet("app", dispatcherServlet);//當Tomcat啟動的時候加載app.setLoadOnStartup(1);//添加映射//注意:不要將映射路徑寫成/*,這種路徑會將靜態資源也進行攔截,// 但是不能正常的匹配映射servlet對象就會報錯app.addMapping("/");}
}

?HspSpringApplication 類中添加工程路徑聯系該項目

package com.study.hspSpringboot;import org.apache.catalina.startup.Tomcat;/*** 該類相當于是一個springboot啟動程序*/
public class HspSpringApplication {//這里會創建Tomcat關聯Spring容器public static void run(){try {//創建TomcatTomcat tomcat = new Tomcat();//將Tomcat關聯該springboot項目//hsp_springboot是工程路徑//C:\Users\DELL\IdeaProjects\hsp-SpringBoot項目路徑//當Tomcat啟動時通過瀏覽器訪問該工程路徑就可以訪問該項目tomcat.addWebapp("/hsp_springboot","C:\\Users\\DELL\\IdeaProjects\\hsp-SpringBoot");//設置端口tomcat.setPort(9090);//啟動tomcat.start();//等待請求接入System.out.println("======等待連接======");tomcat.getServer().await();} catch (Exception e) {throw new RuntimeException(e);}}
}

運行該springboot程序?

解決:在pom.xml文件中引入依賴 (刷新)

        <dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-jasper</artifactId><version>8.5.75</version></dependency>

通過瀏覽器發送請求得到?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902636.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始構建微博爬蟲:實現自動獲取并保存微博內容

從零開始構建微博爬蟲&#xff1a;實現自動獲取并保存微博內容 前言 在信息爆炸的時代&#xff0c;社交媒體平臺已經成為信息傳播的重要渠道&#xff0c;其中微博作為中國最大的社交媒體平臺之一&#xff0c;包含了大量有價值的信息和數據。對于研究人員、數據分析師或者只是…

Uniapp微信小程序:輕松獲取用戶頭像和昵稱

參考文獻&#xff1a;Uniapp微信小程序&#xff1a;輕松獲取用戶頭像和昵稱-百度開發者中心 (baidu.com) uni.login({ provider: weixin, success: function (loginRes) { console.log(loginRes.authResult); // 打印登錄憑證 // 使用登錄憑證獲取用戶信息 uni.getUserInfo({ …

【自然語言處理與大模型】大模型(LLM)基礎知識③

&#xff08;1&#xff09;大模型的“7B”是什么意思&#xff1f; "B"通常代表“Billion”&#xff0c;即十億。因此&#xff0c;當提到7B時&#xff0c;指的是該模型擁有7 billion&#xff08;70億&#xff09;個參數。 &#xff08;2&#xff09;模型后面標的“ins…

聊聊自動化用例的維護

自動化測試中的農藥悖論&#xff1a;為何長期維護至關重要 自動化測試常被視為"一次編寫&#xff0c;永久有效"的解決方案&#xff0c;但隨著時間的推移&#xff0c;即使設計最精良的測試套件也會逐漸失效。這種現象被稱為農藥悖論&#xff08;Pesticide Paradox&am…

微幀Visionular斬獲NAB Show 2025年度產品獎

在本月剛結束的NAB Show 2025展會上&#xff0c;全球領先的視頻編碼與AI超高清服務提供商微幀Visionular大放異彩&#xff0c;其核心產品AI-driven Video Compression&#xff08;AI視頻智能編碼引擎&#xff09;不僅在展會中吸引了眾多行業目光&#xff0c;更憑借其卓越的編碼…

idea中運行groovy程序報錯

我的項目是使用的 gradle 構建的。 在 idea 中運行Groovy的面向對象程序報錯如下&#xff1a; Execution failed for task :Person.main(). > Process command G:/Program Files/jdk-17/jdk-17.0.12/bin/java.exe finished with non-zero exit value 1* Try: Run with --s…

【自然語言處理與大模型】個人使用LLaMA Factory微調的記錄

一、魔塔社區免費服務器如何使用webui微調&#xff1f; 一上來我就得先記錄一下&#xff0c;使用魔塔社區的免費服務器的時候&#xff0c;因為沒有提供ssh而導致無法看到webui的遺憾如何解決的問題&#xff1f; 執行命令 如果點這個鏈接無法彈出微調的webui&#xff0c;則可以在…

【官方正版,永久免費】Adobe Camera Raw 17.2 win/Mac版本 配合Adobe22-25系列軟

Adobe Camera Raw 2025 年 2 月版&#xff08;版本 17.2&#xff09;。目前為止最新版新版已經更新2個月了&#xff0c;我看論壇之前分享的還是2024版&#xff0c;遂將新版分享給各位。 Adobe Camera Raw&#xff0c;支持Photoshop&#xff0c;lightroom等Adobe系列軟件&#…

leetcode:1295. 統計位數為偶數的數字(python3解法)

難度&#xff1a;簡單 給你一個整數數組 nums&#xff0c;請你返回其中位數為 偶數 的數字的個數。 示例 1&#xff1a; 輸入&#xff1a;nums [12,345,2,6,7896] 輸出&#xff1a;2 解釋&#xff1a; 12 是 2 位數字&#xff08;位數為偶數&#xff09; 345 是 3 位數字&…

使用Handsontable實現動態表格和下載表格

1.效果 2.實現代碼 首先要加載Handsontable&#xff0c;在示例中我是cdn的方式引入的&#xff0c;vue的話需要下載插件 let hot null;var exportPlugin null;function showHandsontable(param) {const container document.getElementById("hot-container");// 如果…

2.1 基于委托的異步編程方法

基于委托的異步編程模型是 .NET 早期版本中實現異步操作的一種方式&#xff0c;主要通過 BeginInvoke 和 EndInvoke 方法來實現。這種基于委托的異步模式已被 Task 和 async/await 模式取代&#xff0c;但在維護舊代碼時仍可能遇到這種模式。 委托的方法中&#xff1a;Invoke用…

【Bluedroid】藍牙 HID 設備信息加載與注冊機制及配置緩存系統源碼解析

本篇解析Android藍牙子系統加載配對HID設備的核心流程,通過btif_storage_load_bonded_hid_info實現從NVRAM讀取設備屬性、驗證綁定狀態、構造描述符并注冊到BTA_HH模塊。重點剖析基于ConfigCache的三層存儲架構(全局配置/持久設備/臨時設備),其通過動態持久化判定策略和LRU…

Linux 下的網絡管理(附加詳細實驗案例)

一、簡單了解 NM&#xff08;NetworkManager&#xff09; 在 Linux 中&#xff0c;NM 是 NetworkManager 的縮寫。它是一個用于管理網絡連接的守護進程和工具集。 在 RHEL9 上&#xff0c;使用 NM 進行網絡配置&#xff0c;ifcfg &#xff08;也稱為文件&#xff09;將不再…

長連接、短連接與WebSocket的基本知識

目錄 前言正文 前言 &#x1f91f; 找工作&#xff0c;來萬碼優才&#xff1a;&#x1f449; #小程序://萬碼優才/r6rqmzDaXpYkJZF 爬蟲神器&#xff0c;無代碼爬取&#xff0c;就來&#xff1a;bright.cn Java基本知識&#xff1a; java框架 零基礎從入門到精通的學習路線 附…

2026《數據結構》考研復習筆記四(緒論)

緒論 前言時間復雜度分析 前言 由于先前筆者花費約一周時間將王道《數據結構》知識點大致過了一遍&#xff0c;圈畫下來疑難知識點&#xff0c;有了大致的知識框架&#xff0c;現在的任務就是將知識點逐個理解透徹&#xff0c;并將leetcode刷題與課后刷題相結合。因此此后的過…

Vmware安裝centos7和Redis

2025最詳細vmware安裝centos 7 教程_嗶哩嗶哩_bilibili 1.上面是B站安裝Centos7參考視頻 2.安裝完成需要配置網絡 (新手教程)VMware安裝CentOS7_嗶哩嗶哩_bilibili 重啟網絡服務: ping www.baidu.com ip addr 查看ip地址 兩種重啟方式 3.關閉防火墻 依次執行如下三條命令 …

二進制部署Kubernetes1.32.4最新版本高可用集群及附加組件

一、前言 在云原生技術席卷全球的今天&#xff0c;Kubernetes&#xff08;K8s&#xff09;已成為容器編排領域的事實標準。當大家都習慣了kubeadm、kubeasz等自動化工具一鍵部署的便利時&#xff0c;選擇通過二進制方式手動搭建K8s集群更像是一場"知其然亦知其所以然&qu…

樹莓派系統中設置固定 IP

在基于 Ubuntu 的樹莓派系統中&#xff0c;設置固定 IP 地址主要有以下幾種方法&#xff1a; 方法一&#xff1a;使用 Netplan 配置&#xff08;Ubuntu 18.04 及以上版本默認使用 Netplan&#xff09; 查看網絡接口名稱 在終端輸入ip link或ip a命令&#xff0c;查看當前所使…

主流單片機與編程調試工具對應關系表梳理

單片機系列/型號 | 官方IDE/工具鏈 | 調試器/燒錄器 | 第三方支持工具 |調試接口協議 | 特點與適用場景| | STMicroelectronics (STM32) STM32全系列 STM32CubeIDE ST-LINK/V2/V3 - PlatformIO (VS Code插件) SWD/JTAG 官方集成開發環境&#xff0c;支持HAL庫&#xff0c;免費…

VulnHub-DarkHole_2靶機滲透教程

1.靶機部署 [Onepanda] Mik1ysomething 靶機下載&#xff1a;https://download.vulnhub.com/darkhole/darkhole_2.zip 直接使用VMware導入打開就行 注意&#xff1a;靶機的網絡連接模式必須和kali一樣&#xff0c;讓靶機跟kali處于同一網段&#xff0c;這樣kali才能掃出靶機…