SpringBoot(源码解析 + 实现底层机制)

04-08 8632阅读 0评论

文章目录

    • 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.机制分析
                  • 1.简述
                  • 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项目

                                                SpringBoot(源码解析 + 实现底层机制) 第1张

                                                2.使用Git管理项目(可以略过)
                                                1.创建一个github存储库

                                                SpringBoot(源码解析 + 实现底层机制) 第2张

                                                2.克隆到本地,复制文件夹的内容

                                                SpringBoot(源码解析 + 实现底层机制) 第3张

                                                3.粘贴到idea项目文件夹,将其作为本地仓库与远程仓库关联

                                                SpringBoot(源码解析 + 实现底层机制) 第4张

                                                3.pom.xml 引入父工程和场景启动器
                                                • 其实父工程只是指定了引入依赖的默认版本
                                                • 真正的依赖是场景启动器来引入的
                                                    
                                                    
                                                      spring-boot-starter-parent
                                                      org.springframework.boot
                                                      2.5.3
                                                    
                                                    
                                                      
                                                      
                                                        org.springframework.boot
                                                        spring-boot-starter-web
                                                      
                                                    
                                                  
                                                  4.编写运行类

                                                  SpringBoot(源码解析 + 实现底层机制) 第5张

                                                  package com.sun.springboot;
                                                  import org.springframework.boot.SpringApplication;
                                                  import org.springframework.boot.autoconfigure.SpringBootApplication;
                                                  import org.springframework.context.ConfigurableApplicationContext;
                                                  /**
                                                   * @author 孙显圣
                                                   * @version 1.0
                                                   */
                                                  @SpringBootApplication
                                                  public class MainApp {
                                                      public static void main(String[] args) {
                                                          ConfigurableApplicationContext ioc = SpringApplication.run(MainApp.class, args);
                                                      }
                                                  }
                                                  
                                                  5.启动运行类,思考:tomcat怎么启动的?

                                                  SpringBoot(源码解析 + 实现底层机制) 第6张

                                                  2.@Configuration机制梳理

                                                  1.环境搭建
                                                  1.文件目录

                                                  SpringBoot(源码解析 + 实现底层机制) 第7张

                                                  2.Dog.java
                                                  package com.sun.springboot.bean;
                                                  /**
                                                   * @author 孙显圣
                                                   * @version 1.0
                                                   */
                                                  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;
                                                  /**
                                                   * @author 孙显圣
                                                   * @version 1.0
                                                   */
                                                  @Configuration //作为一个配置类
                                                  public class Config {
                                                      @Bean //将单例bean:Dog注入容器
                                                      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;
                                                  /**
                                                   * @author 孙显圣
                                                   * @version 1.0
                                                   */
                                                  @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.成功获取

                                                  SpringBoot(源码解析 + 实现底层机制) 第8张

                                                  2.机制分析
                                                  1.简述

                                                  SpringBoot(源码解析 + 实现底层机制) 第9张

                                                  2.图解

                                                  SpringBoot(源码解析 + 实现底层机制) 第10张

                                                  3.SpringBoot是怎么启动Tomcat的?

                                                  1.环境搭建
                                                  1.文件目录

                                                  SpringBoot(源码解析 + 实现底层机制) 第11张

                                                  2.HiController.java
                                                  package com.sun.springboot.controller;
                                                  import org.springframework.web.bind.annotation.RequestMapping;
                                                  import org.springframework.web.bind.annotation.RestController;
                                                  /**
                                                   * @author 孙显圣
                                                   * @version 1.0
                                                   */
                                                  @RestController //将所有方法的返回结果转换成json字符串并返回
                                                  public class HiController {
                                                      @RequestMapping("/hi")
                                                      public String hi() {
                                                          return "hi sun HiController";
                                                      }
                                                  }
                                                  
                                                  3.测试访问

                                                  SpringBoot(源码解析 + 实现底层机制) 第12张

                                                  2.源码分析
                                                  1.需求分析

                                                  SpringBoot(源码解析 + 实现底层机制) 第13张

                                                  2.创建容器过程
                                                  1.run方法打断点

                                                  SpringBoot(源码解析 + 实现底层机制) 第14张

                                                  2.进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第15张

                                                  3.进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第16张

                                                  4.进入 SpringApplication

                                                  SpringBoot(源码解析 + 实现底层机制) 第17张

                                                  5.继续进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第18张

                                                  6.放行到创建容器的那个方法

                                                  SpringBoot(源码解析 + 实现底层机制) 第19张

                                                  7.进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第20张

                                                  8.继续进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第21张

                                                  9.下一步

                                                  SpringBoot(源码解析 + 实现底层机制) 第22张

                                                  10.跳出回到createApplicationContext()方法

                                                  SpringBoot(源码解析 + 实现底层机制) 第23张

                                                  3.找到createWebServer()
                                                  1.打断点

                                                  SpringBoot(源码解析 + 实现底层机制) 第24张

                                                  2.放行,并查看目前的容器

                                                  SpringBoot(源码解析 + 实现底层机制) 第25张

                                                  3.进入并执行到refresh方法

                                                  SpringBoot(源码解析 + 实现底层机制) 第26张

                                                  4.进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第27张

                                                  5.再进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第28张

                                                  6.进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第29张

                                                  7.放行到那个断点

                                                  SpringBoot(源码解析 + 实现底层机制) 第30张

                                                  8.进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第31张

                                                  9.下一步,找到了createWebServer方法

                                                  SpringBoot(源码解析 + 实现底层机制) 第32张

                                                  4.启动Tomcat
                                                  1.进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第33张

                                                  2.放行到断点并进入getWebServer

                                                  SpringBoot(源码解析 + 实现底层机制) 第34张

                                                  3.进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第35张

                                                  4.直接跳出

                                                  SpringBoot(源码解析 + 实现底层机制) 第36张

                                                  5.放行到下一个断点,然后进入

                                                  SpringBoot(源码解析 + 实现底层机制) 第37张

                                                  6.进入,给initialize方法下断点

                                                  SpringBoot(源码解析 + 实现底层机制) 第38张

                                                  7.进入,给tomcat.start()下断点

                                                  SpringBoot(源码解析 + 实现底层机制) 第39张

                                                  8.直接放行,tomcat启动成功

                                                  SpringBoot(源码解析 + 实现底层机制) 第40张

                                                  9.回到afterRefresh方法(一直跳出),此时应用程序上下文已经刷新成功

                                                  SpringBoot(源码解析 + 实现底层机制) 第41张

                                                  10.查看目前的容器,完成初始化

                                                  SpringBoot(源码解析 + 实现底层机制) 第42张

                                                  4.SpringBoot(实现底层机制)

                                                  1.创建Tomcat并启动
                                                  1.排除pom.xml中的 spring-boot-starter-tomcat并引入指定版本的Tomcat
                                                      
                                                      
                                                          spring-boot-starter-parent
                                                          org.springframework.boot
                                                          2.5.3
                                                      
                                                      
                                                          
                                                          
                                                              org.springframework.boot
                                                              spring-boot-starter-web
                                                              
                                                              
                                                                  
                                                                      org.springframework.boot
                                                                      spring-boot-starter-tomcat
                                                                  
                                                              
                                                          
                                                          
                                                          
                                                              org.apache.tomcat.embed
                                                              tomcat-embed-core
                                                              8.5.75
                                                          
                                                      
                                                  
                                                  2.编写SunSpringApplication.java
                                                  1.文件目录

                                                  SpringBoot(源码解析 + 实现底层机制) 第43张

                                                  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;
                                                  /**
                                                   * @author 孙显圣
                                                   * @version 1.0
                                                   */
                                                  public class SunSpringApplication {
                                                      /**
                                                       * 创建Tomcat对象,关联Spring容器并启动
                                                       */
                                                      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;
                                                  /**
                                                   * @author 孙显圣
                                                   * @version 1.0
                                                   */
                                                  public class SunMainApp {
                                                      public static void main(String[] args) {
                                                          SunSpringApplication.run();
                                                      }
                                                  }
                                                  
                                                  4.结果展示

                                                  SpringBoot(源码解析 + 实现底层机制) 第44张

                                                  SpringBoot(源码解析 + 实现底层机制) 第45张

                                                  2.创建Spring容器
                                                  1.文件目录

                                                  SpringBoot(源码解析 + 实现底层机制) 第46张

                                                  2.Monster.java
                                                  package com.sun.sunspringboot.bean;
                                                  /**
                                                   * @author 孙显圣
                                                   * @version 1.0
                                                   */
                                                  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;
                                                  /**
                                                   * @author 孙显圣
                                                   * @version 1.0
                                                   */
                                                  @Configuration //配置类
                                                  @ComponentScan("com.sun.sunspringboot") //指定要扫描的包
                                                  public class SunConfig {
                                                      @Bean
                                                      public Monster monster() {
                                                          return new Monster(); //单例bean注入容器
                                                      }
                                                  }
                                                  
                                                  4.SunHiController.java
                                                  package com.sun.sunspringboot.controller;
                                                  import org.springframework.web.bind.annotation.RequestMapping;
                                                  import org.springframework.web.bind.annotation.RestController;
                                                  /**
                                                   * @author 孙显圣
                                                   * @version 1.0
                                                   */
                                                  @RestController
                                                  public class SunHiController {
                                                      @RequestMapping("/sunhi")
                                                      public String hi() {
                                                          return "hi, SunHiController";
                                                      }
                                                  }
                                                  
                                                  3.完成关联
                                                  1.文件目录

                                                  SpringBoot(源码解析 + 实现底层机制) 第47张

                                                  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;
                                                    /**
                                                     * 1.创建自己的Spring容器
                                                     * 2.关联spring容器的配置
                                                     * 3.完成spring容器配置的bean的创建,依赖注入
                                                     * 4.完成中央控制器,并让其持有Spring容器
                                                     * 5.这里的onStartup是Tomcat调用,并把ServletContext对象传入
                                                     */
                                                    public class SunWebApplicationInitializer implements WebApplicationInitializer {
                                                        @Override
                                                        public void onStartup(ServletContext servletContext) throws ServletException {
                                                            System.out.println("start up");
                                                            AnnotationConfigWebApplicationContext ac =
                                                                    new AnnotationConfigWebApplicationContext();
                                                            //完成bean的创建和配置
                                                            ac.register(SunConfig.class); //在ac中注册配置类
                                                            ac.refresh();
                                                            //创建中央控制器
                                                            DispatcherServlet dispatcherServlet = new DispatcherServlet(ac);
                                                            //将中央控制器放到servletContext
                                                            ServletRegistration.Dynamic registration = servletContext.addServlet("app", dispatcherServlet);
                                                            //当tomcat启动时,加载中央控制器
                                                            registration.setLoadOnStartup(1);
                                                            //拦截请求,进行分发处理
                                                            registration.addMapping("/");
                                                        }
                                                    }
                                                    
                                                    3.修改SunSpringApplication设置Tomcat的上下文路径

                                                    SpringBoot(源码解析 + 实现底层机制) 第48张

                                                    4.启动测试
                                                    1.报错

                                                    SpringBoot(源码解析 + 实现底层机制) 第49张

                                                    2.引入对应版本的jasper包即可
                                                            
                                                                org.apache.tomcat
                                                                tomcat-jasper
                                                                8.5.75
                                                            
                                                    
                                                    3.重新启动

                                                    SpringBoot(源码解析 + 实现底层机制) 第50张

                                                    4.访问测试,成功返回结果

                                                    SpringBoot(源码解析 + 实现底层机制) 第51张


免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,8632人围观)

还没有评论,来说两句吧...

目录[+]