当前位置: 首页 > news >正文

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

通过浏览器发送请求得到 

相关文章:

  • 【C++】13.list的模拟实现
  • docker部署seafile修改默认端口并安装配置onlyoffice实现在线编辑
  • 硬核解析:整车行驶阻力系数插值计算与滑行阻力分解方法论
  • 2025-04-23 Python深度学习3——Tensor
  • Transformer:引领深度学习新时代的架构
  • C# 使用Windows API实现键盘钩子的类
  • 【KWDB 创作者计划】_嵌入式硬件篇---数字电子器件
  • Android Cordova 开发 - Cordova 解读初始化项目(index.html meta、Cordova.js、config.xml)
  • AndroidAutomotive模块介绍(四)VehicleHal介绍
  • Pytorch图像数据转为Tensor张量
  • 大厂面试:MySQL篇
  • create_function()漏洞利用
  • centos stream 10 修改 metric
  • LSTM-GAN生成数据技术
  • 4. 继承基类实现浏览器_Chrome
  • 6.1.多级缓存架构
  • 【Axure高保真原型】动态折线图
  • MongoDB Ubuntu 安装
  • 智能文档解析系统架构师角色定义
  • 智驭未来:NVIDIA自动驾驶安全白皮书与实验室创新实践深度解析
  • 聚焦“共赢蓝色未来” “海洋命运共同体”上海论坛举行
  • “电化长江”的宜昌成果:船舶航运停靠都能用电,助力一江清水向东流
  • 泡泡玛特一季度整体收入同比增超1.6倍,海外收入增近5倍
  • 教皇方济各逝世,外交部:表示哀悼,愿同梵方共同推动中梵关系持续改善
  • 教育部召开全国中小学幼儿园安全工作视频会议:加强校园安防建设
  • 普京签署有关批准俄罗斯与伊朗全面战略伙伴关系条约的联邦法令