zoukankan      html  css  js  c++  java
  • SpringBoot系列随笔

    前言

    写完maven的加密插件后,尝试在boot启动时的类加载过程中编写解密代码时,发现了一个平常没有注意的地方.
    那就是boot-jar的启动方式与我们平常编写的可执行jar是存在很大差别的.
    所以在这里进行简单的记录,暂时不对一些复杂机制进行.如repackage阶段对jar文件进行的额外处理,boot-jar加载资源的的实现方式,classLoader实现的扩展等

    开始

    整体流程直接使用时序图进行如下表示

    分步描述(必要的)

    • 步骤1 - 由虚拟机触发,调用类org.springframework.boot.loader.JarLauncher.main方法.

      这一步完全等同于我们使用java -jar hello.jar时,调用了自己面写的main方法.
      而我们所打包的boot-jar,不论如何,最终都会执行语句java -jar boot-jar.jar,并调用方法org.springframework.boot.loader.JarLauncher.main

    • 步骤4-10 - 注册JarUrl协议.

      这一步的主要作用是向系统注册新的协议,使boot可以使用自己的方式获取资源信息(针对boot-jar)

    • 步骤11 - 获取boot-jar内的所有资源定位

      结合JarUrl协议,就可以获取资源了

    • 步骤13 - 创建并配置类加载器

      这个加载器的实现,使用了字节码技术.达到了越过JVM并对class进行了读取的效果.
      这么做的目的,个人推测应该是为了能够在扫描所有可能需要加载的类时,保证不让虚拟机加载它们,以较少虚拟机负担.

    • 14-end - 准备并执行我们编写的main方法

      找到我们所表写的main方法所处的类,并直接使用反射进行调用.
      随着main方法的调用,方法体内的SpringApplication相关方法也意味着容器的初始化,应用正式启动

    • end -
  • 相关阅读:
    bash 中 () {} [] [[]] (()) 的解释
    正则表达式速查笔记
    Makefile速查笔记
    gflags 编译动态库
    在Win10上运行ESXI-Comstomer
    GNU g++常用编译选项用法
    C++标准转换运算符reinterpret_cast
    BZOJ 3211: 花神游历各国【线段树区间开方问题】
    BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】
    BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】
  • 原文地址:https://www.cnblogs.com/heaven-elegy/p/11727083.html
Copyright © 2011-2022 走看看