实现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 {
            //创建Tomcat
            Tomcat 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 {

    @Bean
    public 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 {
    @Override
    public 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 {
            //创建Tomcat
            Tomcat 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>

通过浏览器发送请求得到 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值