Spring是如何做到依赖的jar包不存在build也能通过
Spring是如何做到依赖的jar包不存在build也能通过的,也就是说它集成那么多jar,怎么就能编译通过的。
答案就在maven的pom文件里
<dependencyManagement>
通过这标签就可以管理依赖版本,而不是在编译的时候打到jar包里去。
怎么就这么结束了,我要发问:
说说dependency下面的scope和optional呢,看过好多次了,就是不知道啥用。
其实在<dependency>标签下也有控制jar包是否被打包进去的配置。
1.<scope>test</scope>用来表示只有在测试的时候打进jar包。
2.<optinal>true</optinal>用来表示我引入了依赖H2并且我只希望H2被我这个模块用,其他模块引用我的模块时是不会传递过去的,也就是说这些个其他模块无法使用H2。
那么引入了jar包,这些类是怎么被加载进jvm的呢?
其实很简单,通过classLoader从classpath下的jar包中加载类,加载类的过程分为 加载 链接(验证 准备 解析) 初始化,关键就在于classLoader通过UrlClassPath获取到jar的路径,然后从jar中的manifest中将class的路径读出。
然而也并非完全如此,jar是可以没有manifest的,是不是不存在就直接读里面的文件列表了?
答案是对的,因为我们直接加载class也是可以的,不需要manifest,但是它可以加速识别类文件,给jar包加签名,加一些特性,比如可执行的jar需要Main-Class,可以指定classpath来定制jar的依赖。
小伙伴们可能还遇到过在idea里开发的时候文件是可以读到的,到了jar包里,就找不到了,其实在操作系统里用的是file://协议,不区分大小写,而在jar包里用的是jar://协议,严格区分大小写。
那么这个类到底加载到了jvm的什么地方?答案就是方法区。
那我实例化的对象又存在什么地方呢?答案是堆,堆里有(年轻代(EDEN 8 Survivor 2 = 1 + 1) 老年代)
有了对象,那么我的方法执行有要用到什么呢?答案是方法的计算使用栈,寄存器,本地方法栈。
大家可以继续问自己,栈,寄存器,本地方法栈又是用来做什么的呢?