国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了SpringBoot 底層機制分析【Tomcat 啟動+Spring 容器初始化+Tomcat 如何關聯Spring 容器】【下】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??前言
本篇博文是關于SpringBoot 底層機制分析實現,希望能夠幫助你更好的了解SpringBoot ??

??個人主頁:晨犀主頁
??個人簡介:大家好,我是晨犀,希望我的文章可以幫助到大家,您的滿意是我的動力????

??歡迎大家:這里是CSDN,我總結知識的地方,歡迎來到我的博客,感謝大家的觀看??
如果文章有什么需要改進的地方還請大佬不吝賜教 先在此感謝啦??

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

實現任務階段1- 創(chuàng)建Tomcat, 并啟動

說明: 創(chuàng)建Tomcat, 并啟動

● 代碼實現

1.修改nlc-springboot\pom.xml

<?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.nlc</groupId>
    <artifactId>nlc-springboot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 導入springboot 父工程,規(guī)定的寫法
        解讀:
        1. springboot 我們指定2.5.3
    -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
    </parent>
    <!-- 導入web 項目場景啟動器,會自動導入和web 開發(fā)相關依賴,非常方便-->
    <dependencies>
        <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>
       
        <!--用我們指定tomcat 版本來完, 可以到mvn 去獲取依賴坐標.
       解讀:
        1. 使用指定的tomcat 才會驗證,效果高版本的tomcat默認不會真正監(jiān)聽
        2. 使用了指定tomcat , 需要在spring-boot-starter-web 排除內嵌的 starter-tomcat
        3. 否則會出現包沖突, 提示GenericServlet Not Found 類似錯誤
        -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>8.5.75</version>
        </dependency>
    </dependencies>
</project>

2 、創(chuàng)建nlc-springboot\src\main\java\com\nlc\nlcspringboot\NlcSpringApplication.java

public class NlcSpringApplication {
    //這里我們會創(chuàng)建tomcat對象,并關聯Spring容器, 并啟動
    public static void run() {
        try {
            //創(chuàng)建Tomcat對象 NlcTomcat
            Tomcat tomcat = new Tomcat();
            //1. 讓tomcat可以將請求轉發(fā)到spring web容器,因此需要進行關聯
            //2. "/nlcboot" 就是我們的項目的 application context , 就是我們原來配置tomcat時,指定的application context
            //3. "D:\\nlc_springboot\\nlc-springboot" 指定項目的目錄
            tomcat.addWebapp("/nlcboot","D:\\nlc_springboot\\nlc-springboot");
            //設置9090
            tomcat.setPort(9090);
            //啟動
            tomcat.start();
            //等待請求接入
            System.out.println("======9090====等待請求=====");
            tomcat.getServer().await();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

3、創(chuàng)建nlc-springboot\src\main\java\com\nlc\nlcspringboot\NlcMainApp.java

public class NlcMainApp {
    public static void main(String[] args) {
        //啟動NlcSpringBoot項目/程序
        NlcSpringApplication.run();
    }
}

完成測試

運行效果

SpringBoot 底層機制分析【Tomcat 啟動+Spring 容器初始化+Tomcat 如何關聯Spring 容器】【下】,SpringBoot,手寫機制,spring,spring boot,tomcat

SpringBoot 底層機制分析【Tomcat 啟動+Spring 容器初始化+Tomcat 如何關聯Spring 容器】【下】,SpringBoot,手寫機制,spring,spring boot,tomcat

瀏覽器請求, http://localhost:9090/ , 這時沒有返回信息

SpringBoot 底層機制分析【Tomcat 啟動+Spring 容器初始化+Tomcat 如何關聯Spring 容器】【下】,SpringBoot,手寫機制,spring,spring boot,tomcat

實現任務階段2- 創(chuàng)建Spring 容器

說明: 創(chuàng)建Spring 容器

● 代碼實現

1 、創(chuàng)建nlc-springboot\src\main\java\com\nlc\nlcspringboot\bean\Monster.java , 做一個測試Bean

public class Monster {
}

2 、創(chuàng)建nlc-springboot\src\main\java\com\nlc\nlcspringboot\controlller\HiController.java, 作為Controller

@RestController
public class NlcHiController {

    @RequestMapping("/hi")
    public String hi() {
        System.out.println("hi i am HiController");
        return "hi i am HiController";
    }
}

3 、創(chuàng)建nlc-springboot\src\main\java\com\nlc\nlcspringboot\config\NlcConfig.java , 作為Spring 的配置文件.

@Configuration
@ComponentScan("com.nlc.nlcspringboot")
public class NlcConfig {

    /**
    * 1. 通過@Bean 的方式, 將new 出來的Bean 對象, 放入到Spring 容器
    * 2. 該bean 在Spring 容器的name 就是方法名
    * 3. 通過方法名, 可以得到new Monster()
    */
    @Bean
    public Monster monster() {
        return new Monster();
    }
}

4 、創(chuàng)建nlc-springboot\src\main\java\com\nlc\nlcspringboot\NlcWebApplicationInitializer.java , 作為Spring 的容器.

/**
 * 解讀
 * 1. 創(chuàng)建我們的Spring 容器
 * 2. 加載/關聯Spring容器的配置-按照注解的方式
 * 3. 完成Spring容器配置的bean的創(chuàng)建, 依賴注入
 * 4. 創(chuàng)建前端控制器 DispatcherServlet , 并讓其持有Spring容器
 * 5. 當DispatcherServlet 持有容器, 就可以進行分發(fā)映射, 回憶我們實現SpringMVC底層機制
 * 6. 這里onStartup 是Tomcat調用, 并把ServletContext 對象傳入
 */
public class NlcWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {

        System.out.println("startup ....");
        //加載Spring web application configuration => 容器
        //自己 寫過 NlcSpringApplicationContext
        AnnotationConfigWebApplicationContext ac =
                new AnnotationConfigWebApplicationContext();
        //在ac中注冊 NlcConfig.class 配置類
        ac.register(NlcConfig.class);
        ac.refresh();//刷新上下文,完成bean的創(chuàng)建和配置

        //1. 創(chuàng)建注冊非常重要的前端控制器 DispatcherServlet
        //2. 讓DispatcherServlet 持有容器
        //3. 這樣就可以進行映射分發(fā), 回憶一下SpringMvc機制[自己實現過]
        //NlcDispatcherServlet
        DispatcherServlet dispatcherServlet = new DispatcherServlet(ac);
        //返回了ServletRegistration.Dynamic對象
        ServletRegistration.Dynamic registration =
                servletContext.addServlet("app", dispatcherServlet);
        //當tomcat啟動時,加載 dispatcherServlet
        registration.setLoadOnStartup(1);
        //攔截請求,并進行分發(fā)處理
        //這里提示/ 和/*的配置,會匹配所有的請求,
        //當Servlet 配置了"/", 會覆蓋tomcat 的DefaultServlet, 當其他的utl-pattern 都匹配不上時, 都會走這個Servlet, 這樣可以攔截到其它靜態(tài)資源
        //這個默認的servlet 是處理靜態(tài)資源的,一旦攔截,靜態(tài)資源不能處理
        //當Servelt 配置了"/*", 表示可以匹配任意訪問路徑
        registration.addMapping("/");
    }
}

實現任務階段3- 將Tomcat 和Spring 容器關聯, 并啟動Spring 容器

說明: 將Tomcat 和Spring 容器關聯, 并啟動Spring 容器

● 代碼實現

  1. 修改nlc-springboot\src\main\java\com\nlc\nlcspringboot\NlcSpringApplication.java
public class NlcSpringApplication {
    //這里我們會創(chuàng)建tomcat對象,并關聯Spring容器, 并啟動
    public static void run() {
        try {
            //創(chuàng)建Tomcat對象 NlcTomcat
            Tomcat tomcat = new Tomcat();
            //1. 讓tomcat可以將請求轉發(fā)到spring web容器,因此需要進行關聯
            //2. "/nlcboot" 就是我們的項目的 application context , 就是我們原來配置tomcat時,指定的application context
            //3. "D:\\nlc_springboot\\nlc-springboot" 指定項目的目錄
            tomcat.addWebapp("/nlcboot","D:\\nlc_springboot\\nlc-springboot");
            //設置9090
            tomcat.setPort(9090);
            //啟動
            tomcat.start();
            //等待請求接入
            System.out.println("======9090====等待請求=====");
            tomcat.getServer().await();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
  1. debug 一下, 看看是否進行Spring 容器的初始化工作, 可以看到ac.refresh() 會將NlcConfig.class 中配置Bean 實例化裝入到容器中…

SpringBoot 底層機制分析【Tomcat 啟動+Spring 容器初始化+Tomcat 如何關聯Spring 容器】【下】,SpringBoot,手寫機制,spring,spring boot,tomcat

SpringBoot 底層機制分析【Tomcat 啟動+Spring 容器初始化+Tomcat 如何關聯Spring 容器】【下】,SpringBoot,手寫機制,spring,spring boot,tomcat

里面有很多,可以自己看看

SpringBoot 底層機制分析【Tomcat 啟動+Spring 容器初始化+Tomcat 如何關聯Spring 容器】【下】,SpringBoot,手寫機制,spring,spring boot,tomcat

完成測試

1、啟動項目, 運行NlcMainApp

public class NlcMainApp {
    public static void main(String[] args) {
        //啟動NlcSpringBoot項目/程序
        NlcSpringApplication.run();
    }
}

2、運行的效果

SpringBoot 底層機制分析【Tomcat 啟動+Spring 容器初始化+Tomcat 如何關聯Spring 容器】【下】,SpringBoot,手寫機制,spring,spring boot,tomcat

SpringBoot 底層機制分析【Tomcat 啟動+Spring 容器初始化+Tomcat 如何關聯Spring 容器】【下】,SpringBoot,手寫機制,spring,spring boot,tomcat

注意事項和細節(jié)

1、如果啟動包異常, 如下:

嚴重: Servlet [jsp] in web application [/nlcboot] threw load() exception
java.lang.ClassNotFoundException: org.apache.jasper.servlet.JspServlet
2 、解決方案, 引入對應版本的jasper 包即可, 修改nlc-springboot\pom.xml

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

??總結

  1. 如果啟動包異常出現上述異常, 引入對應版本的jasper 包就可以解決。
  2. 前面配置的application context可以根據自己的需求修改。
  3. 指定項目的目錄要根據自己的項目情況進行修改,否則會出現FileNotFoundException(系統找不到指定的文件)或NoSuchFileException(沒有此類文件)。

??熱門專欄推薦
SpringBoot篇
SpringBoot 底層機制分析[上]
SpringBoot容器–注解的使用
SpringBoot 自動配置–常用配置
SpringBoot 依賴管理和自動配置—帶你了解什么是版本仲裁
Spring Boot介紹–快速入門–約定優(yōu)于配置

文章到這里就結束了,如果有什么疑問的地方請指出,諸大佬們一起來評論區(qū)一起討論??
希望能和諸大佬們一起努力,今后我們一起觀看感謝您的閱讀??
如果幫助到您不妨3連支持一下,創(chuàng)造不易您們的支持是我的動力??文章來源地址http://www.zghlxwxcb.cn/news/detail-636661.html

到了這里,關于SpringBoot 底層機制分析【Tomcat 啟動+Spring 容器初始化+Tomcat 如何關聯Spring 容器】【下】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • spring5源碼篇(13)——spring mvc無xml整合tomcat與父子容器的啟動

    spring5源碼篇(13)——spring mvc無xml整合tomcat與父子容器的啟動

    spring-framework 版本:v5.3.19 試想這么一個場景。只用 spring mvc(確切來說是spring-framework), 如何既不搭建web工程(無web.xml)又不用 spring boot 的去整合tomcat部署一個web服務? 1、引入 tomcat 和 spring mvc 2、實現 WebApplicationInitializer接口,即本篇實現的spring mvc 提供的 AbstractAnnotati

    2024年02月15日
    瀏覽(25)
  • SpringBoot源碼學習4——SpringBoot內嵌Tomcat啟動流程源碼分析

    SpringBoot源碼學習4——SpringBoot內嵌Tomcat啟動流程源碼分析

    系列文章目錄和關于我 我在初學spring的時候,很懵逼,因為整個項目中不存在main方法,讓我有點摸不著頭腦。那時候我知道有個東西叫tomcat是它監(jiān)聽了端口,解析了協議調到了我的servlet。 在我初學SpringBoot的時候,很懵逼,有main方法了,但是tomcat在哪里呢,又是如何啟動起

    2024年02月04日
    瀏覽(20)
  • SpringBoot配置外部Tomcat項目啟動流程源碼分析

    SpringBoot配置外部Tomcat項目啟動流程源碼分析

    SpringBoot應用默認以Jar包方式并且使用內置Servlet容器(默認Tomcat),該種方式雖然簡單但是默認不支持JSP并且優(yōu)化容器比較復雜。故而我們可以使用習慣的外置Tomcat方式并將項目打War包。 ① 同樣使用Spring Initializer方式創(chuàng)建項目 ② 打包方式選擇\\\"war\\\" ③ 選擇添加的模塊 ④ 創(chuàng)建的

    2024年02月04日
    瀏覽(25)
  • SpringBoot源碼分析之Tomcat是如何在SpringBoot中啟動的?

    SpringBoot源碼分析之Tomcat是如何在SpringBoot中啟動的?

    一.前言 我們知道SpringBoot可以直接把傳統的war包打成可執(zhí)行的jar包,直接啟動。這得益于SpringBoot內置了容器可以直接啟動。本文將以 Tomcat 為例,來看看 SpringBoot 是如何啟動 Tomcat 的。 一.SpringApplication初始化 調用到最終的run方法我們來看一下 這里面首先創(chuàng)建了一個SpringAppl

    2024年02月05日
    瀏覽(23)
  • JavaWeb 手寫Tomcat底層機制

    JavaWeb 手寫Tomcat底層機制

    目錄 一、Tomcat底層整體架構 ? ? ? ? 1.簡介 :? ? ? ? ? 2.分析圖?:? ? ? ? ? 3.基于Socket開發(fā)服務端的流程 :? ? ? ? ? 4.打通服務器端和客戶端的數據通道 :? 二、多線程模型的實現 ? ? ? ? 1.思路分析 :? ? ? ? ? 2.處理HTTP請求 :? ? ? ? ? 3.自定義Tomcat :? 三、自定義Ser

    2024年02月14日
    瀏覽(28)
  • SpringBoot系列(四十四):Tomcat與Undertow容器性能對比分析|超級詳細,建議收藏

    SpringBoot系列(四十四):Tomcat與Undertow容器性能對比分析|超級詳細,建議收藏

    ????????Tomcat和Undertow都是非常流行的Java Web容器,它們都有自己的優(yōu)缺點。但在實際項目中,我們如何選擇最合適的容器呢?是選擇老牌的Tomcat,還是選擇后起之秀的Undertow?本篇文章將深入分析Tomcat和Undertow的性能表現,為大家揭秘最佳選擇!無論你是Java開發(fā)者還是想深

    2023年04月21日
    瀏覽(45)
  • SpringBoot2.0(Spring讀取配置文件常用方法,打war包在Tomcat中啟動)

    SpringBoot2.0(Spring讀取配置文件常用方法,打war包在Tomcat中啟動)

    在springBoot聲明周期內,可以使用@Value注解從SpringBoot的默認配置文件中讀取配置信息 例如在Controller中使用: @Value可以放到屬性或方法上,能夠正常使用的前提是所在類,必須在SpringBoot的生命周期內。 我們怎么把一個類放到Spring的生命周期中進行管理?使用的是@Component注解

    2024年02月09日
    瀏覽(24)
  • 【JavaWeb】Tomcat底層機制和Servlet運行原理

    【JavaWeb】Tomcat底層機制和Servlet運行原理

    ??歡迎來到@dandelionl_的csdn博文,本文主要講解Java?web中Tomcat底層機制和Servlet的運行原理的相關知識?? ??我是dandelionl_,一個正在為秋招和算法競賽做準備的學生?? ??喜歡的朋友可以關注一下,下次更新不迷路?? ?Ps: 月亮越亮說明知識點越重要 (重要性或者難度越大)????

    2024年02月16日
    瀏覽(18)
  • spring 容器結構/機制debug分析--Spring 學習的核心內容和幾個重要概念--IOC 的開發(fā)模式--綜合解圖

    spring 容器結構/機制debug分析--Spring 學習的核心內容和幾個重要概念--IOC 的開發(fā)模式--綜合解圖

    ??前言 本片文章是spring 容器結構/機制debug分析和幾個重要概念以及IOC 的開發(fā)模式 ??個人主頁:[塵覺主頁](https://blog.csdn.net/apple_67445472?type=blog) ??個人簡介:大家好,我是塵覺,希望我的文章可以幫助到大家,您的滿意是我的動力???? 在csdn獲獎榮譽: ??csdn城市之星2名

    2024年02月02日
    瀏覽(46)
  • 從HTTP到Tomcat:揭秘Web應用的底層協議與高性能容器

    從HTTP到Tomcat:揭秘Web應用的底層協議與高性能容器

    1.1 HTTP-概述 1.1.1 介紹 HTTP:Hyper Text Transfer Protocol(超文本傳輸協議),規(guī)定了瀏覽器與服務器之間數據傳輸的規(guī)則。 http是互聯網上應用最為廣泛的一種網絡協議 http協議要求:瀏覽器在向服務器發(fā)送請求數據時,或是服務器在向瀏覽器發(fā)送響應數據時,都必須按照固定的格式進

    2024年02月05日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包