为了账号安全,请及时绑定邮箱和手机立即绑定

springboot源码学习笔记之进入之前发生了啥

标签:
Java SpringBoot

虽然用springboot也有一段时间,但是之前也没怎么关注过springboot项目打包过程中发生了什么启动过程细节是什么
直到最近在搞公司的私有化大平台时需要了解更多的本质上的东西才细细品味了一下springboot的源码从起源开始……

springboot 程序长啥样身材和脸蛋

@SpringBootApplication@EnableAutoConfigurationpublic class EgojitApplication {    public static void main(String[] args) {
        SpringApplication.run(EgojitApplication.class, args);
    }
}

我第一眼看到特别亲切这就是一个main程序啊然后再看一眼好像比普通的main上面多了两个注解,总以为两眼就了解她和普通的main也没什么不同么啊其实只是了解了身材和脸蛋需要三回眸免得错过什么精彩内容然后我使用 spring-boot-maven-plugin 进行打包生成一个jar包既然要深入了解她的“品质”啊那就得由内而外unzip 这个美丽的jar吧

springboot的jar包内在品质

名词说明

我们这里把由 spring-boot-maven-plugin maven插件打包的jar包称为“胖jar”或者“聚合jar”不仅仅只有这一种打包胖jar的方式我们约定胖jar就是spring-boot-maven-plugin插件打包的jar包我喜欢约定,把maven-jar-plugin 默认打包出来的jar包称为“瘦jar”或者“散jar”

  • 胖jar/聚合jar
    整个项目会打包成一个jar包所有的依赖jar包被打进一个jar包

  • 瘦jar/散jar
    整个项目jar包是散的依赖的包和项目主class或者jar是平行的

N01 有内涵

https://img1.sycdn.imooc.com//5b92a2c30001102e12320466.jpg
unzip后发现这个和普通的main程序jar包完全不同啊包含BOOT-INFMETA-INF,org三个目录然后可以看见BOOT-INF/classes才是真正的classpath,而传统的jar包直接解压后就是classpath

N02 有特色

https://img1.sycdn.imooc.com//5b92a2ce00014cd110500876.jpg
META-INF目录中我重点关注MANIFEST.INF文件我看到了我不敢相信的一幕她和普通main区别大大的她可不是表面上看到的那样入口main在JarLauncher中记住它后面我们分析spring-boot-loader源码从它入手所以我推翻我之前的认知springboot的xxxApplicaion中的main不是普通的main。它只是一个被xxxApplicion调用的普通方法而已和普通的MANIFEST.INF不同它还有一个Start-Class不要怀疑这个就是我们写的xxxApplicaion; Spring-Boot-Classes指出了springboot的特殊class目录Spring-Boot-Lib配置第三方依赖包目录

N03 超仙

https://img1.sycdn.imooc.com//5b92a2d50001ece512380450.jpg

org目录有点神奇出现了超自然现象啊我的项目绝对没有org.springframework.boot包啊。它从哪里来的我怀疑人生的打开项目依赖找了一遍我确定它是超自然现象好仙不是我等凡人容易理解的我想到既然我没干什么那就绝对是打包干的谁打包
spring-boot-maven-plugin 对就是它被我逮到了它把项目打包成我们看到的目录结构同时把spring-boot-loader jar包中的class拷贝到项目中了

spring-boot-loader 分析

以下是JarLauncher执行流程分析

https://img1.sycdn.imooc.com//5b92a2dd000123b223901232.jpg

通过源码分析流程可以知道spring-boot-load模块通过自定义jar包结构自定义类加载器优雅的实现了嵌套jar资源的加载通过打包时候重新设置启动类和组织jar结构通过运行时设置自定义加载器来实现嵌套jar资源加载
知道这些我们可以实现自己的JarLauncher实现Archive动态指定实现插件化既然spring-boot-loader能指定lib以及class目录那么我们也可以实现自己的JarLauncher合并更多的lib目录实现外部扩展lib再结合spring boot中的spring.factries的原理扫描注入代码公司的私有化平台中的应用托管就是我在研究spring-boot-loader这种原理结合spring boot中的spring.factries的机制基础上实现的改造了原来基于java的jagent方式。这种方案解决了很多问题其中第三方springboot应用日志采集性能监控健康检查等等都可以基于这个机制去实现了解这个原理多么重要更多的就涉密了……。哈哈……

原文出处https://www.cnblogs.com/qlsy/p/9607550.html

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消