• SpringBoot源码学习


    1.本地打好一个基于springboot项目的jar包

                   springboot-demo-0.0.1-SNAPSHOT.jar

    2.解压jar包查看目录结构

    2.1 BOOT-INF下目录

       BOOT-INF分为两部分,classes为整个项目的class文件

     lib为项目依赖的所有jar包

    2.2 META-INF下目录

     其中maven下为pom的管理信息,
    其中pom.xml就是项目中的源文件,

    pom.properties为基础信息

    pom.properties

      2.3 MANIFEST.MF(核心)                                          

     MANIFEST.MF作为springboot的核心配置文件,里面记录了各种版本信息和lib库,jdk等。

     例如:Manifest-Version,项目名,自定义pom-version,启动类main方法,完整源文件,lib库,运行环境jdk版本,springboot版本,主类加载器

    1. Manifest-Version: 1.0
    2. Implementation-Title: springboot-demo
    3. Implementation-Version: 0.0.1-SNAPSHOT
    4. Start-Class: com.sjzl.SpringbootDemoApplication
    5. Spring-Boot-Classes: BOOT-INF/classes/
    6. Spring-Boot-Lib: BOOT-INF/lib/
    7. Build-Jdk-Spec: 1.8
    8. Spring-Boot-Version: 2.1.11.RELEASE
    9. Created-By: Maven Archiver 3.4.0
    10. Main-Class: org.springframework.boot.loader.JarLauncher

    基于这些信息,不难看出,springboot项目是如何启动的,通过main-class加载器,加载start-class,通过main方法里面的组合注解读取所有配置并加入到pring容器中。

    2.4 org包下即为springboot类加载器

     核心为JarLauncher,通过BOOT_INF_CLASSES和BOOT_INF_LIB可以读取项目编译后的class文件和所有依赖的jar(里面编译后的文件)

    1. static final String BOOT_INF_CLASSES = "BOOT-INF/classes/";
    2. static final String BOOT_INF_LIB = "BOOT-INF/lib/";

    JarLauncher完整源代码:

    1. public class JarLauncher extends ExecutableArchiveLauncher
    2. {
    3. static final String BOOT_INF_CLASSES = "BOOT-INF/classes/";
    4. static final String BOOT_INF_LIB = "BOOT-INF/lib/";
    5. public JarLauncher()
    6. {
    7. }
    8. protected JarLauncher(Archive archive)
    9. {
    10. super(archive);
    11. }
    12. protected boolean isNestedArchive(org.springframework.boot.loader.archive.Archive.Entry entry)
    13. {
    14. if (entry.isDirectory())
    15. return entry.getName().equals("BOOT-INF/classes/");
    16. else
    17. return entry.getName().startsWith("BOOT-INF/lib/");
    18. }
    19. public static void main(String args[])
    20. throws Exception
    21. {
    22. (new JarLauncher()).launch(args);
    23. }
    24. }

    JarLauncher extends ExecutableArchiveLauncher 

    ExecutableArchiveLauncher extends  Launcher

  • 相关阅读:
    Vue3 学习笔记
    人生如何破局?
    研究前沿| Nature:艰难梭菌引发肠道神经源性炎症的新机制
    SpringMVC学习笔记(八)—— RESTFul案例-实现增删改查
    PeLK:101 x 101 的超大卷积网络,同参数量下反超 ViT | CVPR 2024
    service workers跟页面dom交互
    企业注销的债权债务如何处理
    在 debian 虚拟机里如何设置 iso 文件为本地安装源
    剑指offer62 圆圈中最后剩余的数字
    最适合入门的100个深度学习实战项目
  • 原文地址:https://blog.csdn.net/riju4713/article/details/126922972