实现SpringBoot底层机制
Tomcat底层启动分析+Spring容器初始化+Tomcat关联Spring容器
1.任务1-创建Tomcat,并启动
(1)创建一个Maven项目,修改pom.xml文件:我们需要自己创建Tomcat对象,因此在引入的场景启动器中排除SpringBoot内嵌的Tomcat,并引入tomcat依赖库
<!--导入SpringBoot父工程-规定写法-->
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.5.3</version>
</parent>
<dependencies>
<!--导入web项目场景启动器:会自动导入和web开发相关的所有依赖[jar包]-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--因为我们要自己创建Tomcat对象,并启动,因为我们要先排除内嵌的spring-boot-starter-tomcat-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--指定Tomcat版本,引入tomcat依赖库
1.指定版本为8.5.75
2.如果我们引入了自己指定的tomcat,一定要记住把前面的spring-boot-starter-tomcat排除
3.否则会出现GenericServletNotFound错误-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.75</version>
</dependency>
</dependencies>
(2)创建LiSpringApplication.java
package com.li.lispringboot;
import org.apache.catalina.startup.Tomcat;
/**
* @author 李
* @version 1.0
*/
public class LiSpringApplication {
//创建tomcat对象,并关联spring容器,然后启动tomcat
public static void run() {
try {
//创建tomcat对象
Tomcat tomcat = new Tomcat();
//设置默认端口-9090
tomcat.setPort(9090);
//启动,就会在指定端口监听
tomcat.start();
//等待请求接入
System.out.println("======9090端口等待请求接入======");
tomcat.getServer().await();
} catch (Exception e) {
e.printStackTrace();
}
}
}
(3)LiMainApp
package com.li.lispringboot;
/**
* @author 李
* @version 1.0
*/
public class LiMainApp {
public static void main(String[] args) {
//启动LiSpringBoot项目/程序
LiSpringApplication.run();
}
}
(4)测试启动main方法,后台输出如下:
打开浏览器,访问9090端口,页面一片空白,因为这时候还没有接入其他组件。
2.任务2-创建Spring容器
(1)创建Monster.java,做一个测试bean
package com.li.lispringboot.bean;
/**
* @author 李
* @version 1.0
*/
public class Monster {
}
(2)创建HelloController.java,做一个测试Controller
package com.li.lispringboot.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 李
* @version 1.0
*/
@RestController
public class HelloController {
@RequestMapping("/hello")
public String Hello() {
return "Hello,I'm HelloController!";
}
}
(3)创建LiConfig.java,作为Spring的配置文件
package com.li.lispringboot.config;
import com.li.lispringboot.bean.Monster;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @author 李
* @version 1.0
* 配置类-作为Spring的配置文件
* 这里有一个问题,容器怎么知道要扫描哪些包?
*/
@Configuration
@ComponentScan("com.li.lispringboot")//指定要配置类扫描哪些包
public class LiConfig {
//注入Bean-Monster对象到Spring容器
@Bean
public Monster monster() {
return ne