SpringBoot系列随笔 - BootJar的启动方式
前言
写完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 -
SpringBoot系列随笔 - BootJar的启动方式的更多相关文章
- SpringBoot系列之集成Dubbo的方式
SpringBoot系列之集成Dubbo的方式 本博客介绍Springboot框架集成Dubbo实现微服务的3种常用方式,对于Dubbo知识不是很熟悉的,请先学习我上一篇博客:SpringBoot系列 ...
- SpringBoot系列-整合Mybatis(注解方式)
目录 一.常用注解说明 二.实战 三.测试 四.注意事项 上一篇文章<SpringBoot系列-整合Mybatis(XML配置方式)>介绍了XML配置方式整合的过程,本文介绍下Spring ...
- springboot系列(三) 启动类中关键注解作用解析
一.Springboot:请求入口 @SpringBootApplication @EnableAspectJAutoProxy @EnableScheduling @EnableTransactio ...
- springboot的mvn与gradle启动方式
1 很简单,直接鼠标右击项目,run启动项目 2 项目目录下的命令行 mvn spring-boot:run 或者 gradlew bootRun 3 进入libs下或者target下 java ...
- SpringBoot系列: Spring支持的异常处理方式
===================================视图函数返回 status code 的方式===================================Spring 有 ...
- spring-boot的三种启动方式[z]
https://blog.csdn.net/u011425751/article/details/79507386 有段时间没有写博客了,也在努力的从传统单机开发向分布式系统过度,所以再次做一些笔记, ...
- SpringBoot系列: 极简Demo程序和Tomcat war包部署
=================================SpringBoot 标准项目创建步骤================================= 使用 Spring IDE( ...
- SpringBoot系列之学习教程汇总
对应SpringBoot系列博客专栏,例子代码,本博客不定时更新 一.配置篇 SpringBoot系列之@PropertySource读取yaml文件 >> source down ...
- SpringBoot系列之从入门到精通系列教程
对应SpringBoot系列博客专栏,例子代码,本博客不定时更新 Spring框架:作为JavaEE框架领域的一款重要的开源框架,在企业应用开发中有着很重要的作用,同时Spring框架及其子框架很多, ...
随机推荐
- 基于Docker快速搭建ELK【华为云技术分享】
[摘要] 本文基于自建的Docker平台速搭建一套完整的ELK系统,相关的镜像直接从Docker Hub上获取,可以快速实现日志的采集和分析检索. 准备镜像 l 获取ES镜像:docker pull ...
- 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)
题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...
- 淘宝适配 flexible.js
1.引入 阿里cdm文件,也可以自己下载下来引用,不需要在添加<meta name="viewport"">标签了 <script src=" ...
- 2018HDU多校训练一 C -Triangle Partition
Chiaki has 3n3n points p1,p2,-,p3np1,p2,-,p3n. It is guaranteed that no three points are collinear. ...
- 深入理解 Java 方法
方法(有的人喜欢叫函数)是一段可重用的代码段.
- RequireJS 打包工具
r.js是RequireJS的一个附产品,支持在 NodeJS环境下运行AMD程序,并且其包含了一个名为RequireJS Optimizer的工具,可以为项目完成合并脚本等优化操作 RequireJ ...
- springboot自动装配(3)---条件注解@Conditional
之前有说到springboot自动装配的时候,都是去寻找一个XXXAutoConfiguration的配置类,然而我们的springboot的spring.factories文件中有各种组件的自动装配 ...
- WinForm 自定义控件 - RooF
由3个标签组成 直接代码 public partial class Roof : UserControl { public Roof() { InitializeComponent(); } priv ...
- flash插件
偶尔见到别人的博客侧边栏 有一些很有意思的flash插件,也想加入到自己博客里面,这里来大概讲一下~ 一.支持js代码 首先要在 博客设置 >开启博客侧边栏公告的js代码支持,提交审核后 很快 ...
- CCF-CSP题解 201903-3 损坏的RAID5
先吐槽先吐槽!因为输入太大,需要用fgets,读n个字符或读到回车终止. char *fgets(char *str, int n, FILE *stream) 因为scanf模拟考试T了10+次.因 ...