文章目录
1.搭建SpringBoot底层机制开发环境 1.创建maven项目 2.使用Git管理项目(可以略过) 1.创建一个github存储库 2.克隆到本地,复制文件夹的内容 3.粘贴到idea项目文件夹,将其作为本地仓库与远程仓库关联
3.pom.xml 引入父工程和场景启动器 4.编写运行类 5.启动运行类,思考:tomcat怎么启动的?
2.@Configuration机制梳理 1.环境搭建 1.文件目录 2.Dog.java 3.Config.java 注入单例Dog对象 4.MainApp.java测试是否能够获取bean 5.成功获取
2.机制分析
3.SpringBoot是怎么启动Tomcat的? 1.环境搭建 1.文件目录 2.HiController.java 3.测试访问
2.源码分析 1.需求分析 2.创建容器过程 1.run方法打断点 2.进入 3.进入 4.进入 SpringApplication 5.继续进入 6.放行到创建容器的那个方法 7.进入 8.继续进入 9.下一步 10.跳出回到createApplicationContext()方法
3.找到createWebServer() 1.打断点 2.放行,并查看目前的容器 3.进入并执行到refresh方法 4.进入 5.再进入 6.进入 7.放行到那个断点 8.进入 9.下一步,找到了createWebServer方法
4.启动Tomcat 1.进入 2.放行到断点并进入getWebServer 3.进入 4.直接跳出 5.放行到下一个断点,然后进入 6.进入,给initialize方法下断点 7.进入,给tomcat.start()下断点 8.直接放行,tomcat启动成功 9.回到afterRefresh方法(一直跳出),此时应用程序上下文已经刷新成功 10.查看目前的容器,完成初始化
4.SpringBoot(实现底层机制) 1.创建Tomcat并启动 1.排除pom.xml中的 spring-boot-starter-tomcat并引入指定版本的Tomcat 2.编写SunSpringApplication.java 1.文件目录 2.创建Tomcat对象,关联Spring容器并启动 3.编写SunMainApp.java,启动Tomcat 4.结果展示
2.创建Spring容器 1.文件目录 2.Monster.java 3.SunConfig.java 4.SunHiController.java
3.完成关联 1.文件目录 2.编写SunWebApplicationInitializer的onStartup方法 3.修改SunSpringApplication设置Tomcat的上下文路径 4.启动测试 1.报错 2.引入对应版本的jasper包即可 3.重新启动 4.访问测试,成功返回结果
1.搭建SpringBoot底层机制开发环境
1.创建maven项目
2.使用Git管理项目(可以略过)
1.创建一个github存储库
2.克隆到本地,复制文件夹的内容
3.粘贴到idea项目文件夹,将其作为本地仓库与远程仓库关联
3.pom.xml 引入父工程和场景启动器
其实父工程只是指定了引入依赖的默认版本 真正的依赖是场景启动器来引入的
< parent>
< artifactId> spring-boot-starter-parent</ artifactId>
< groupId> org.springframework.boot</ groupId>
< version> 2.5.3</ version>
</ parent>
< dependencies>
< dependency>
< groupId> org.springframework.boot</ groupId>
< artifactId> spring-boot-starter-web</ artifactId>
</ dependency>
</ dependencies>
4.编写运行类
package com. sun. springboot ;
import org. springframework. boot. SpringApplication ;
import org. springframework. boot. autoconfigure. SpringBootApplication ;
import org. springframework. context. ConfigurableApplicationContext ;
@SpringBootApplication
public class MainApp {
public static void main ( String [ ] args) {
ConfigurableApplicationContext ioc = SpringApplication . run ( MainApp . class , args) ;
}
}
5.启动运行类,思考:tomcat怎么启动的?
2.@Configuration机制梳理
1.环境搭建
1.文件目录
2.Dog.java
package com. sun. springboot. bean ;
public class Dog {
}
3.Config.java 注入单例Dog对象
package com. sun. springboot. config ;
import com. sun. springboot. bean. Dog ;
import org. springframework. context. annotation. Bean ;
import org. springframework. context. annotation. Configuration ;
@Configuration
public class Config {
@Bean
public Dog dog ( ) {
return new Dog ( ) ;
}
}
4.MainApp.java测试是否能够获取bean
package com. sun. springboot ;
import com. sun. media. sound. SoftTuning ;
import org. springframework. boot. SpringApplication ;
import org. springframework. boot. autoconfigure. SpringBootApplication ;
import org. springframework. context. ConfigurableApplicationContext ;
@SpringBootApplication
public class MainApp {
public static void main ( String [ ] args) {
ConfigurableApplicationContext ioc = SpringApplication . run ( MainApp . class , args) ;
Object bean = ioc. getBean ( "dog" ) ;
System . out. println ( bean) ;
}
}
5.成功获取
2.机制分析
1.简述
2.图解
3.SpringBoot是怎么启动Tomcat的?
1.环境搭建
1.文件目录
2.HiController.java
package com. sun. springboot. controller ;
import org. springframework. web. bind. annotation. RequestMapping ;
import org. springframework. web. bind. annotation. RestController ;
@RestController
public class HiController {
@RequestMapping ( "/hi" )
public String hi ( ) {
return "hi sun HiController" ;
}
}
3.测试访问
2.源码分析
1.需求分析
2.创建容器过程
1.run方法打断点
2.进入
3.进入
4.进入 SpringApplication
5.继续进入
6.放行到创建容器的那个方法
7.进入
8.继续进入
9.下一步
10.跳出回到createApplicationContext()方法
3.找到createWebServer()
1.打断点
2.放行,并查看目前的容器
3.进入并执行到refresh方法
4.进入
5.再进入
6.进入
7.放行到那个断点
8.进入
9.下一步,找到了createWebServer方法
4.启动Tomcat
1.进入
2.放行到断点并进入getWebServer
3.进入
4.直接跳出
5.放行到下一个断点,然后进入
6.进入,给initialize方法下断点
7.进入,给tomcat.start()下断点
8.直接放行,tomcat启动成功
9.回到afterRefresh方法(一直跳出),此时应用程序上下文已经刷新成功
10.查看目前的容器,完成初始化
4.SpringBoot(实现底层机制)
1.创建Tomcat并启动
1.排除pom.xml中的 spring-boot-starter-tomcat并引入指定版本的Tomcat
< parent>
< artifactId> spring-boot-starter-parent</ artifactId>
< groupId> org.springframework.boot</ groupId>
< version> 2.5.3</ version>
</ parent>
< 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>
< dependency>
< groupId> org.apache.tomcat.embed</ groupId>
< artifactId> tomcat-embed-core</ artifactId>
< version> 8.5.75</ version>
</ dependency>
</ dependencies>
2.编写SunSpringApplication.java
1.文件目录
2.创建Tomcat对象,关联Spring容器并启动
package com. sun. sunspringboot ;
import org. apache. catalina. LifecycleException ;
import org. apache. catalina. startup. Tomcat ;
import org. springframework. boot. autoconfigure. web. ServerProperties ;
public class SunSpringApplication {
public static void run ( ) {
try {
Tomcat tomcat = new Tomcat ( ) ;
tomcat. setPort ( 9090 ) ;
tomcat. start ( ) ;
System . out. println ( "Tomcat在9090端口监听" ) ;
tomcat. getServer ( ) . await ( ) ;
} catch ( LifecycleException e) {
throw new RuntimeException ( e) ;
}
}
}
3.编写SunMainApp.java,启动Tomcat
package com. sun. sunspringboot ;
public class SunMainApp {
public static void main ( String [ ] args) {
SunSpringApplication . run ( ) ;
}
}
4.结果展示
2.创建Spring容器
1.文件目录
2.Monster.java
package com. sun. sunspringboot. bean ;
public class Monster {
}
3.SunConfig.java
package com. sun. sunspringboot. config ;
import com. sun. sunspringboot. bean. Monster ;
import org. springframework. beans. factory. annotation. Configurable ;
import org. springframework. context. annotation. Bean ;
import org. springframework. context. annotation. ComponentScan ;
import org. springframework. context. annotation. Configuration ;
@Configuration
@ComponentScan ( "com.sun.sunspringboot" )
public class SunConfig {
@Bean
public Monster monster ( ) {
return new Monster ( ) ;
}
}
4.SunHiController.java
package com. sun. sunspringboot. controller ;
import org. springframework. web. bind. annotation. RequestMapping ;
import org. springframework. web. bind. annotation. RestController ;
@RestController
public class SunHiController {
@RequestMapping ( "/sunhi" )
public String hi ( ) {
return "hi, SunHiController" ;
}
}
3.完成关联
1.文件目录
2.编写SunWebApplicationInitializer的onStartup方法
在Tomcat启动的时候会调用onStartup方法 首先注册配置类,然后将中央控制器放到 servletContext
package com. sun. sunspringboot ;
import com. sun. sunspringboot. config. SunConfig ;
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 ;
public class SunWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup ( ServletContext servletContext) throws ServletException {
System . out. println ( "start up" ) ;
AnnotationConfigWebApplicationContext ac =
new AnnotationConfigWebApplicationContext ( ) ;
ac. register ( SunConfig . class ) ;
ac. refresh ( ) ;
DispatcherServlet dispatcherServlet = new DispatcherServlet ( ac) ;
ServletRegistration. Dynamic registration = servletContext. addServlet ( "app" , dispatcherServlet) ;
registration. setLoadOnStartup ( 1 ) ;
registration. addMapping ( "/" ) ;
}
}
3.修改SunSpringApplication设置Tomcat的上下文路径
4.启动测试
1.报错
2.引入对应版本的jasper包即可
< dependency>
< groupId> org.apache.tomcat</ groupId>
< artifactId> tomcat-jasper</ artifactId>
< version> 8.5.75</ version>
</ dependency>
3.重新启动
4.访问测试,成功返回结果