SpringBoot的模块及结构
转载
1 前⾔
由于现在微服务很流⾏,越来越多企业采⽤了SpringCloud微服务架构,⽽SpringBoot则是快速构建微服务项⽬的利器。于是源码笔记以此为切⼊点,将SpringBoot作为我们源码分析的第⼀个开源项⽬,之后还会对更多开源项⽬进⾏源码分析。要进⾏源码分析,笔者结合⾃⾝经历来跟⼤家聊聊我们为什么要学习源码这个话题,⼤家⼀起探讨学习。
我们程序员在开发代码时每天都在使⽤别⼈写好的框架,⽆论你是在使⽤Spring⽣态的Spring核⼼,SpringMVC,SpringBoot和SpringCloud等框架,还是在使⽤阿⾥系的Dubbo,RocketMQ,Seata,Druid等中间件框架,亦或你是搞⼤数据的,在使⽤Apache组织的
Zookeeper,Hadoop,Hive,Spark等⼤数据组件框架,这些开源框架都给我们的项⽬编码带来了极⼤的⽅便,促进了我们的开发效率。是的,这些都是开源⼤神们帮我们造好的轮⼦,我们直接使⽤即可,⽽且⽤起来很少出bug,因为这些框架⼀般都是经过考验的才能流⾏起来。
可能⼤部分⼈会认为,这些轮⼦都已经造好了,我们直接⽤即可。是的,这些开源框架对我们使⽤来说
是透明的,它们就像⼀个个⿊盒⼦。⾄于这些⿊盒⾥⾯装的是什么东西,⾥⾯是怎样构造的,如果没有去探究这些⿊盒的话,我们⽆从得知。但是,我们做开发的天天跟这些⿊盒打交道,难道你就没有⼀种强烈的欲望想知道这些⿊盒⾥⾯装的是什么东西,⿊盒⾥⾯是怎样构造的么?难道你就不想知道我们天天使⽤的⿊盒⼦⾥⾯的原理么?
那么今天就跟⼩伙伴们聊聊“我们为什么要学习开源框架源码?学习开源框架源码对我们有⽤吗?”这个话题。
2 我们为什么要学习源码?花那么多时间去学习源码值得么?
可能有些同学会问:我们为什么要去学习源码?花那么多时间去学习源码值得么?
对于这个问题,应该很多⼩伙伴在没读源码前深有感触。当时应该就是这种观念,反正开源框架⼀些外⾯的⼤⽜帮我们封装好了,⾃⼰开箱即⽤即可,管它⾥⾯⿊盒机制是啥。应该很多⼩伙伴也是这种观念,导致⾃⼰在开发项⽬时若遇到bug时⼀筹莫展,百度了很多解决⽅案都⽆效,故⽽浪费了很多时间。于是才会决⼼钻研⼀些常⽤框架的源码。可见,没必要学习源码的观念是可能是最错误的观念吧,个⼈观点(仅供参考)。
我们学习源码⽆⾮有以下⼏个原因:
1)开发项⽬需求需要
⼀⽅⾯,通常我们在开发项⽬的时候,遇到Bug是再正常不过的事情。⽐如某个⼯作项⽬采⽤了Spring⽣态系列的框架⽐如
SpringBoot,SpringCloud等,当出现问题时⾃⼰要会解决,如果我们不懂框架⾥⾯的⿊盒机制,当出现问题我们肯定会⼀头雾⽔,不知如何着⼿解决开源框架出现的问题,此时我们肯定会去百度,但百度的⽂章质量参差不齐,最坏的结果可能就是我们根据百度的解决⽅案,⼀个⼀个去试了,但仍然没有解决问题。这就是对框架⿊盒机制不熟悉的原因导致的。
另⼀⽅⾯,我们在开发项⽬的时候,有时候开源框架不能完全符合我们的业务需求,此时我们需要对开源框架进⾏扩展甚⾄是改造,⽐如我们正在使⽤dubbo框架,若dubbo⾃带负载均衡策略不能满⾜我们的业务需求,此时我们是不是得要对dubbo的负载均衡策略进⾏替换或扩展。幸好,dubbo提供了SPI接⼝给我们即插即⽤,此时我们不⽤研究dubbo⾥⾯的⿊盒也可以做到替换现有的负载均衡策略。那假如有⼀天,我们要对某个开源项⽬进⾏改造呢?此时是不是也需要我们知道开源框架的⿊盒机制,若不懂框架⿊盒原理,此时我们是⽆法下⼿的。
由于项⽬开发需要的以上原因,所以我们平时有空时就要多学习源码,多探究⾥⾯的⿊盒机制,磨⼑不误砍柴⼯。
这个就是典型的项⽬开发需求驱动我们不得不去研究开源框架的源码机制的原因吧。
2)对技术饱含热爱,不断深⼊学习⿊盒机制
是的,除了项⽬需求开发需要去研究源码外,应该很多⼩伙伴都是出于对技术的追求去研究开源框架源码。他们为了不断提⾼⾃⼰的编码能⼒,去不断学习外⾯⼤⽜们的优秀作品。是的,⼤家都知道,闭门造车可以说是造不出名车的,此时,我们必须去学习⼤⽜们优秀的开源作品,学习他们是怎么⾯向对象编程的,学习他们是如何熟练运⽤设计模式的,学习他们是怎样设计接⼝的等等,真的有太多需要我们学习了。如果我们⾛的是技术路线,对技术还有更⾼的追求,学习源码可以说是我们绕不过去的路。因此,⾏动起来吧,源码搞起来,我们只有不断学习源码,以后再阅读其他项⽬的源码时才会游刃有余。
3)有些⼈学习源码,可能是为了⾯试
当然,有些⼈学习源码,可能是为了⾯试。因为现在很多⾯试若⾯试官稍微问难⼀点的问题都会涉及源码,往往很多⼈就是对源码不熟悉⽽挂掉。因为⼀部分⼩伙伴往往就是为了⾯试才去学习源码,但是往往这种为了⾯试才去学习源码的⽅式效果没有前⾯的项⽬驱动⽅式和技术追求⽅式的效果那么好(个⼈观点,不喜勿喷)。因为,有些同学为了⾯试,通常都是短期突击源码,为了某个⾯试问题⽽背诵⼀些答案,因为死记硬背的居多,所以这种⽅式往往深⼊不了源码的精髓。当然,不管出于什么
⽬的学习源码都理应⿎励,因为毕竟去学习源码了肯定就会有提⾼,就踏出了与众不同的⼀步。
3 学习源码,我们能得到什么?
是的,既然我们花费了那么多时间去学习源码,去研究源码?我们的收益有多少,我们究竟能得到多少回到回报呢?可以先肯定的回答,当然有很⼤的回报。前⾯也说过,学习开源框架源码能帮助我们解决项⽬遇到的bug,扩展我们的项⽬需求;通过学习源码,学习开源⼤⽜们是如何运⽤设计模式的,然后运⽤到我们开发的项⽬中,使我们的项⽬的模块更易于扩展;通过学习源码,我们能编码更⾼效。为什么呢?如果我们对某个开源项⽬源码很熟悉,那么我们就可以对这个项⽬的源码信⼿拈来应⽤到⾃⼰项⽬中,不是么?总之学习源码好处多多,这也是成为⼤⽜们的必经之路吧,只有学习和借鉴别⼈优秀的作品,⾃⼰才能造出更优秀的作品。说到这点,不得不说下RocketMQ,RocketMQ是阿⾥的⼀款优秀的开源中间件,RocketMQ之所以性能⾼吞吐,抗得住阿⾥双⼗⼀的考验,其正是很多⽅⾯借鉴了Kafka的设计;此外,记得Dubbo的⼀个缓冲类也是借鉴了Netty的ByteBuf类。
是吧,要造出⼀些优秀的作品,必须去学习借鉴别⼈的优秀作品。
4 要想不被淘汰,必须学习源码
最后要说的是,要想不被淘汰,我们必须学习源码。
现在程序员越来越多,可以说竞争尤其激烈。如果我们想不被淘汰,则我们时刻要保持竞争⼒,那么必然要时刻学习,终⽣学习,⽣⽽有涯⽽学⽆涯。因为CRUD⼤家都会,要提⾼⾃⼰的技术能⼒,此时学习开源项⽬的源码就尤为关键了。如果我们不想成为CRUD⼯程师,还有更⾼的技术追求,那么我们就要有更⾼的要求。当然,学习开源项⽬源码的⽬的是借鉴⼤⽜们的优秀作品,最终要学以致⽤。另外,个⼈观点:学习源码是提⾼⾃⼰编码能⼒的最好⽅式。
如果我们⾛的是技术路线⽽⾮管理路线,若还有更⾼的技术追求,那么学习源码是我们绕不过去的砍。
真的,学习源码实在是太重要了。
只要我们还有更⾼的技术追求,或许你想成为技术⼤⽜,但是学习源码是成为⼤⽜的必经之路。不是每个⼈都能成为⼤⽜,但不学源码就肯定成为不了⼤⽜,因为学习源码是提⾼⾃⼰的最好⽅式,不论何时,学习源码都不会晚,共勉!
Are u ready?
转载
1 前⾔
本⽂接上篇⽂章,那么本篇⽂章再继续跟⼩伙伴们聊聊源码这个话题。
在⼯作之余开始写SpringBoot源码分析专栏前,跟⼩伙伴们聊聊“分析开源项⽬源码,我们该如何⼊⼿分析?”这个话题,我们就随便扯⽪,反正是跟⼩伙伴们⼀起学习交流,没必要太正式。
⼩伙伴们看完本⽂后,若有⾃⼰的源码阅读⼼得可以在下⾯进⾏评论或私聊我进⾏分享,让我从⼩伙伴们⾝上GET多点源码阅读的⼀些技巧,嘿嘿。
2 学习开源框架源码到底难不难?
那么,先跟⼩伙伴们聊聊学习开源框架源码的感受,请问你们认为学习开源框架源码到底难不难?这是⼀个开放的话题,可谓仁者见仁,智者见智。有⼀些开源⼤⽜们会说,So easy!;有⼀些有源码阅读习惯且⼯作多年的⼩伙伴们会说,还好。;有⼀些刚开始学习源码的⼩伙伴们会说,太难了!。是的,不同⼯作经验不同技术层次的⼈的回答是不⼀样的。
那么刚开始学习开源项⽬源码难不难呢?应该对绝⼤部分⼩伙伴们来说应该是偏难的。为什么呢?可能有以下四点原因:
1. ⼀个能流⾏起来的成熟的开源项⽬必定功能齐全,可扩展,⽽功能齐全可扩展的开源项⽬必定很复杂,代码量⼤。⽐如Spring5框架的源
码⾏数达到了六七⼗万⾏,SpringBoot的源码⾏数达到了25万⾏左右,Dubbo和RocketMQ的源码⾏数达到了10万⾏。⼀个成熟的开源项⽬代码量这么多,可以想象其有多复杂。
2. 阅读源码时,我们有时候⽆法猜透源码作者当时编码时的想法。因为在刚开始阅读源码的过程中,我们肯定会遇到很不懂的代码,不知道
作者为何这么写,为何在这个位置写代码,这些都是很正常的,因为当初作者为啥这么写,可能是针对⼀些⽐较特殊的业务场景,或者为了某⽅⾯的性能等等,我们根本⽆法猜透。打个不太恰当的⽐喻,阅读源码猜测作者的⼼思就像当初遇到⼀个⾃⼰喜欢的姑娘,猜测她的⼼思⼀样,⽐如猜测她喜欢什么,她的兴趣爱好是什么。其实刚开始阅读源码也⼀样,有些地⽅我们⼀开始是⽆法猜透作者的⼼思的。3. 有些开源框架可能集操作系统知识,数据结构,算法和设计模式于⼀⾝。是的,优秀的框架必定是集成了很多设计模式于⼀⾝,⽬前为⽌
笔者还没见过哪种流⾏的⼜没有应⽤设计模式的框架哈。⽐如很多框架运⽤了单例模式,⼯⼚模式,责任链模式,装饰器模式和模板⽅法模式等,因为使⽤设计模式能让框架易于扩展。同时,不乏⼀些框架应⽤了⼀些操作系统层⾯的知识,这⼀块⽐较底层,相信很多学java 的⼩伙伴没接触过。此外,开源框架某些地⽅会⽤到数据结构和算法,举个栗⼦,⽐如Dubbo默认有四种负载均衡策略,⽽每种策略⼜对应⼀种算法,其中⼜数RoundRobinLoadBalance负载均衡策略最复杂,⼀开始实现RoundRo
binLoadBalance负载均衡的⽅式并不太完美或者说有bug,Dubbo也是重写过RoundRobinLoadBalance⼏次,最终借鉴了Nginx的RoundRobinLoadBalance负载均衡算法。
上篇⽂章《》也说过优秀框架之间的思想都是互相借鉴的,这就是我们要学习源码的原因之⼀。
这⾥好像扯的有点远了,总之这⾥要说明的是阅读优秀框架是有⼀定难度的。
4. 有些开源框架注释太少也增加了阅读源码的难度。说到开源项⽬注释,如果我们阅读⽼外写的的框架源码可能还好,⼀般都会有⼤量注
释,⽐如Spring框架,可以说⼏乎每个⽅法都有注释,这个就给我们阅读源码起了很⼤的帮助。不过唯⼀不好的可能就是英⽂注释,阅读对英语有⼀定的要求。其实英⽂注释还好,遇到不懂的,百度翻⼀下就好了。其实⽐较头疼的就是⼀些国内优秀的开源框架,其注释可以说是很少的,这⽆疑⼤⼤增加了阅读的难度,甚⾄有些框架的⽂档也不齐全,那就更加GG了。
3 该如何⼊⼿去分析开源框架源码?
前⾯跟⼩伙伴们聊了阅读源码的难度,千万不要被吓慌了。伟⼤的⽑主席说过,我们要在战略上藐视敌⼈战术上重视敌⼈。不可否认,刚开始阅读某个开源项⽬的源码是有⼀定的难度。注意,前⾯的⽤词是刚开始,刚开始哈。也就是说如果我们坚持阅读源码的话,养成阅读源码是陶冶情操的习惯的话
(⽹上看到的这句话,这⾥引⽤装,嘿嘿),长期坚持下来再去阅读其他项⽬的源码,游刃有余不敢说,但肯定可以很快⼊⼿。
那么,我们该如何⼊⼿去分析开源框架源码呢?
⾸先,结合前⾯所说的阅读源码之所以难的原因,我们就要有针对性的去克服解决。⽐如有空多学学设计模式,算法和英语。这些软实⼒确实对阅读源码有很⼤帮助。
其次,阅读源码的前提是什么?当然,阅读源码是要建⽴在会使⽤的基础上,就像若还不会⾛路就学骑单车⼀样,若连⽤都不会就去钻研源码可能会适得其反。
最后,我们阅读源码要注意⼀些技巧,现在根据⾃⾝经历总结⼀下相关思路和技巧,如下:
1. 开始阅读源码时,先对框架的模块及其关系有⼀个整体的认识。我们要对框架项⽬的模块和⽬录要有⼀个全盘的了解,要知道每个模块是
⼲嘛的,然后要了解模块与模块之间的关系。
springboot框架的作用举个栗⼦,⽐如Dubbo的模块分包核⼼的主要有以下⼋个,如下图,我们要知道最基础的的模块应该是dubbo-common公共逻辑
模块,这个模块作为最基础的模块,主要是提供了通⽤模型和⼯具类;然后dubbo-remoting是远程通讯模块,依赖于dubbo-
common模块,相当于Dubbo协议的实现;⽽dubbo-rpc则是远程调⽤模块,依赖于dubbo-remoting模块,抽象各种协议,以及动态代理;dubbo-cluster是集模块,依赖于dubbo-rpc模块,将多个服务提供⽅伪装为⼀个提供⽅,包括:负载均衡, 容错,路由等。
2. 分析源码先从⽗类或⽗接⼝开始分析。因为⽗类或者⽗接⼝往往代表了⼀类功能,这些基类或基类接⼝往往抽象了各个具体⼦类共有的属
性和⾏为,⼀些⽐较基础的⽅法都在⽗类中实现,然后留个模板⽅法给⼦类去实现即可(模板⽅法的应⽤)。
举个栗⼦,这⾥还是拿Dubbo的负载均衡来说吧,如下图,LoadBalance是各种负载均衡策略的超级接⼝,定义了 select ⽅法⽤
来实现选择哪台机器;然后AbstractLoadBalance是⼀个抽象类,实现了LoadBalance接⼝,在覆盖了 select ⽅法后,其⼜增加了calculateWarmupWeight 和 getWeight 权重相关的两个⽅法,因为这些⽅法都跟具体的负载均衡策略类有关,故在⽗类实现了。
值得注意的是AbstractLoadBalance抽象类的 select ⽅法中⾥留了个给⼦类覆盖的 doSelect ⽅法,具体的负载均衡策略将在
doSelect中实现。
3. 阅读源码前⾸先要到启动类。阅读分析源码时要先从启动类开始,因此到框架启动的⼊⼝很重要。
4. 阅读源码时要分清主⼲和枝节代码。到启动⼊⼝后,然后就可以顺着启动⼊⼝⼀步⼀步调试来阅读源码了。不过在初次调试源码时值得
注意的是⼀定要分清主次代码,即要先阅读主⼲代码,其他枝枝节节的代码没明⽩的可以放⼀边。切忌⼀开始就深⼊细节然后出不来了,这样就会造成只见冰⼭⼀⾓⽽看不到全貌的感觉。
5. 阅读源码前要分清主次模块。即阅读分析源码不能漫⽆⽬的,全盘通读,我们要从我们平时有⽤到的模块开始分析。每个⼈的时间都很宝
贵,我们要把时间花在⼑刃上。⽐如SpringBoot增加的新特性中有⾃动配置,⽽⾃动配置特性⼜⾮常重要,因此可以挑选⾃动配置来进⾏源码分析。
6. 要充分利⽤源码项⽬的测试类。之前也说过,⼀个框架之所以能流⾏,必定是经过⼤量测试的。因此如果我们像具体了解某个类和某个⽅
法,我们可以充分利⽤这些测试类来辅助我们源码分析。
7. 要学会⼀些调试技巧。这⼀点也很重要,⽐如在调试过程中如何查看调⽤关系等等,这⾥不多说,这篇⽂章中分享了⼤量调试的⼲活,⼩
伙伴们可以瞅瞅。此外,还要学会有技巧的搜索源码,说到这⾥,下⾯举个栗⼦。
举个Spring事件监听的栗⼦。⽐如我们现在要知道哪个监听了ContextRefreshedEvent事件,此时我们可以通过idea全局搜索"(ContextRefreshedEvent"关键字,得到以下截图:从下图可以看到spring-webmvc模块的FrameworkServlet,spring-context
模块的ScheduledAnnotationBeanPostProcessor,和spring-jms模块的JmsListenerEndpointRegistry等类订阅了
ContextRefreshedEvent事件,那么在容器刷新的时候这⼏个类将会监听到ContextRefreshedEvent事件,执⾏⼀些初始化逻辑。
8. 肯定还有⼤量的阅读源码技巧,希望本⽂能起到抛砖引⽟的作⽤,期待⼩伙伴们可以留⾔分享下,让笔者也收益⼀下。
4 学源码,谈实践,论坚持
最后,我们学习源码不是为了学习⽽学习,最理想的效果我们要学以致⽤。⽐如把从源码中学习到的设计模式,接⼝设计⽅法,⾯向对象原则和相关算法等等都可以应⽤到我们⼿头的项⽬中,这才是我们学习源码的最终⽬的,也是源码学习的最理想的效果。可能这⾥有些⼩伙伴会说,我平时参与的项⽬都是业务类的项⽬,⽽不是开发基础框架,开发中间件,CRUD⽐较多,可能学习基础框架的源码对我们⽤处很少。其实不是的,只要你有参与项⽬,学习源码我们学习的是思想,我们就可以把源码框架设计中的思想应⽤到我们的项⽬中。
最后的最后,我们来谈谈坚持,这是最难能可贵的。很多⼤道理我们都懂,⽐如要坚持运动,坚持学习,坚持...,可是就是没能坚持下来,包括我⾃⼰,嘿嘿。坚持这东西太南了,不过还是应该给⾃⼰⽴个flag吧,把⾃⼰有⽤到的框架⽐如
SpringBoot,Spring,Mybatis,Dubbo,SpringCloud等框架源码都阅读分析⼀遍,加油,⼩伙伴们共勉!
转载
1 前⾔
这是SpringBoot2.1源码分析专题的第⼀篇⽂章,主要讲如何来搭建我们的源码阅读调试环境。如果有经验的⼩伙伴们可以略过此篇⽂章。
2 环境安装要求
IntelliJ IDEA
JDK1.8
Maven3.5以上
3 从github上将SpringBoot源码项⽬下载下来
⾸先提供SpringBoot2.1.0的github地址:
因为要进⾏阅读源码和分析源码项⽬,我们是不是要在⾥⾯写⼀些注释帮助我们阅读理解源码,因此需要将SpringBoot源码项⽬fork到⾃⼰的github仓库中,然后再利⽤git clone url命令将已经fork到⾃⼰github仓库的SpringBoot源码拉取下来即可。
但由于以上⽅式往往很慢,通常会超时,所以笔者直接将SpringBoot项⽬直接下载下来,然后再导⼊IDEA中。
4 将SpringBoot源码项⽬导⼊到IDEA中
将刚才下载的spring-boot2.1.0.RELEASE项⽬选择maven⽅式导⼊到IDEA中,然后⼀直next即可导⼊完成,注意选择JDK版本是1.8,maven版本是3.5+。
此时下载maven依赖是⼀个漫长的等待过程,建议maven没有配置阿⾥云仓库的⼩伙伴们配置⼀下,这样下载速度会快很多。参考进⾏配置即可。
5 编译构建SpringBoot源码项⽬
此时导⼊项⽬后,我们进⾏编译构建SpringBoot源码项⽬了,在构建之前做两个配置:
1. 我们要禁⽤maven的代码检查,在根l中增加⼀下配置即可,如下图:
2. 可能有的⼩伙伴们的l⽂件的project标签上显⽰java.lang.OutOfMemoryError错误,这是因为IDEA⾥的Maven的importer设置的JVM
最⼤堆内存过⼩⽽导致的,如下图,此时可参考解决即可。
进⾏了上⾯的两点配置后,此时我们就可以直接执⾏以下maven命令来编译构建源码项⽬了。
mvn clean install -DskipTests -Pfast
此时⼜是漫长的等待,我这⾥等待5分钟左右就显⽰构建成功了,如下图:
6 运⾏SpringBoot⾃带的sample
因为SpringBoot源码中的spring-boot-samples模块⾃带了很多DEMO样例,我们可以利⽤其中的⼀个sample来测试运⾏刚刚构建的springboot 源码项⽬即可。但此时发现spring-boot-samples模块是灰⾊的,如下图:
这是因为spring-boot-samples模块没有被添加到根l中,此时将其添加到根l中即可,增加如下配置,如下图:
此时我们挑选spring-boot-samples模块下的spring-boot-sample-tomcat样例项⽬来测试好了,此时启动SampleTomcatApplication的main函数,启动成功界⾯如下:
然后我们再在浏览器发送⼀个HTTP请求,此时可以看到服务端成功返回响应,说明此时SpringBoot源码环境就已经构建成功了,接下来我们就可以进⾏调试了,如下图:
7 动⼿实践环节
前⾯已经成功构建了SpringBoot的源码阅读环境,⼩伙伴们记得⾃⼰动⼿搭建⼀套属于⾃⼰的SpringBoot源码调试环境哦,阅读源码动⼿调试很重要,嘿嘿。
转载
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE
1 前⾔
本篇接
。
前⾯搭建好了⾃⼰本地的SpringBoot源码调试环境后,此时我们不要急着下⼿进⼊到具体的源码调试细节中,刚开始阅读源码,此时我们⼀定要对项⽬结构等有⼀个整体的认识,然后再进⾏源码分析调试。推荐阅读下笔者之前写的的⼀⽂,⼲货满满哦。
2 SpringBoot源码模块⼀览
我们先来对SpringBoot的源码模块来⼀个⼤致的了解,如下图:
从上图可以看到,主要有以下四个模块:
spring-boot-project:整个SpringBoot框架全部功能在这个模块实现,SpringBoot项⽬95%的代码都在这⾥实现,源码总共有25万⾏左右。
Spring-boot-samples:这个是SpringBoot给⼩伙伴们赠送的福利,⾥⾯包含了各种各样使⽤SpringBoot的简单demo,我们调试阅读源码的时候可以充分利⽤该模块。
Spring-boot-sample-invoker:这个模块应该是跟sample模块有关,注意根l中有这么⼀句话:Samples are built via the invoker plugin,该模块⽆代码。
Spring-boot-tests:这个模块SpringBoot的测试模块,跟部署测试和集成测试有关。
因为SpringBoot的全部功能在spring-boot-project模块实现,因此下⾯重点来介绍下 spring-boot-project 模块。
3 spring-boot-project源码模块详解
先来看下spring-boot-project整体模块结构,如下图,然后我们再逐个来介绍:
1) spring-boot-parent
这个模块没有代码,是spring-boot模块的⽗项⽬,被其他⼦模块继承。
2) spring-boot
这个模块是SpringBoot项⽬的核⼼,可以说⼀些基础核⼼的功能都在这⾥实现,为SpringBoot的其他模块组件功能提供了⽀持,主要包括以下核⼼功能:
SpringApplication类,这个是SpringBoot的启动类,提供了⼀个静态的run⽅法来启动程序,该类主要⽤来创建并且刷新Spring容器ApplicationContext.
⽀持选择不同的容器⽐如Tomcat,Jetty等来作为应⽤的嵌⼊容器,这个是SpringBoot的新特性之⼀。
外部配置⽀持,这个指的是我们执⾏java -jar xxx.jar命令时可以带⼀些参数,⽐如执⾏java -jar demo.jar --server.port=8888来将应⽤端⼝修改为8888.
该模块内置了⼀些SpringBoot启动时的⽣命周期事件和⼀些容器初始化器(ApplicationContext initializers),来执⾏⼀些SpringBoot启动时的初始化逻辑。
3) spring-boot-autoconfigure
这个模块跟SpringBoot的⾃动配置有关,也是SpringBoot的新特性之⼀。⽐如SpringBoot能基于类路径来⾃动配置某个项⽬模块,⾃动配置最为关键的注解是@EnableAutoConfiguration,这个注解能触发Spring上下⽂的⾃动配置。另外⼀个重要的注解是@Conditional。
举个栗⼦,若HSQLDB在项⽬的类路径中,且我们没有配置任何其他数据库的连接,此时⾃动配置就会⾃动根据类路径来创建相应的bean。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论