- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
springboot应用启动原理分析
springboot应用启动原理分析
PAGE/NUMPAGES
springboot应用启动原理分析
springbootquickstart
在springboot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个WebServer。
如果之前没有使用过springboot可以通过下面的demo来感受下。?
下面以这个工程为例,演示如何启动Springboot项目:
gitclone:hengyunabc/spring—boot—demo。git
mvnspring-boot-demo
java—jartarget/demo—0。0.1—SNAPSHOT.jar
1
2
3
如果使用的IDE是springsts或者idea,可以通过向导来创建springboot项目。
也可以参考官方教程:?
HYPERLINK”\l”getting—started-first-application”\t”_blank\l”getting—started—first—application\t_blank”
原始的Jar是这样子的:
jar:0.0。1-SNAPSHOT。jar!/
1
jar包里的资源的URL:
jar:0。0。1—SNAPSHOT.jar!/com/example/SpringBootDemoApplication.class
1
可以看到对于Jar里的资源,定义以’!/来分隔.原始的Jar只支持一个’!/。
Springboot扩展了这个协议,让它支持多个’!/’,就可以表示jarinjar,jarindirectory的资源了。
比如下面的URL表示demo—0.0。1—SNAPSHOT.jar这个jar里lib目录下面的spring-beans—4。2。3.RELEASE。jar里面的MANIFEST。MF:
jar:0。0。1—SNAPSHOT.jar!/lib/spring—beans—4.2。3.RELEASE.jar!/META-INF/MANIFEST.MF
1
自定义URLStreamHandler,扩展Jar
在构造一个URL时,可以传递一个Handler,而JDK自带有默认的Handler类,应用可以自己注册Handler来处理自定义的URL。
publicURL(Stringprotocol,
Stringhost,
intport,
Stringfile,
URLStreamHandlerhandler)
throwsMalformedURLException
1
2
3
4
5
6
参考:?
HYPERLINK”\l”URL-java。lang。String—java.lang.String-int—java。lang.String—\l”URL—java。lang.String—java.lang。String-int—java.lang。String—”\t”_blank
Springboot通过注册了一个自定义的Handler类来处理多重jarinjar的逻辑。
这个Handler内部会用SoftReference来缓存所有打开过的JarFile。
在处理像下面这样的URL时,会循环处理!/’分隔符,从最上层出发,先构造出demo-0。0.1-SNAPSHOT。jar这个JarFile,再构造出spring-beans—4.2.3.RELEASE。jar这个JarFile,然后再构造出指向MANIFEST.MF的JarURLConnection。
jar:0.0.1—SNAPSHOT。jar!/lib/spring—beans-4。2.3。RELEASE.jar!/META-INF/MANIFEST。MF
1
//org。springframework。boot.loader。jar。Handler
publicclassHandlerextendsURLStreamHandler{
privatestaticfinalStringSEPARATOR=!/;
privatestaticSoftReferenceMap〈File,JarFile〉root;
@Override
protectedURLConnectionopenConnection(URLurl)throwsIOException
文档评论(0)