随笔- 54  评论- 811  文章- 0 

欢乐谷娱乐vip体育在线最高占成: 品Spring:SpringBoot轻松取胜bean定义注册的“第一阶段”

本文来源:http://www.yu833.com/www_wenkang_cn/

申博在线娱乐登入,  7%以上的增速已经超过全国平均水平,适当放慢脚步,是为了走得更好。传统文化是依靠文化传统而延续的。虽然这一速度与数年前相比有所下降,但如今6.5%的经济增速带来的增量已超过以往10%增速带来的增量。  欧盟提出所谓新手段的核心是对特定行业在特定情况下出现的“倾销”行为,采取精确重点打击手段。

  解读专家:军史专家、中国人民革命军事博物馆原研究员 姜廷玉  央广网9月9日消息提到长征,人们常会习惯性地想起红军战士的铮铮铁骨。  从收入增速看,前三季度,贵州、青海城镇居民收入增速为9%,部分省份的城镇居民收入增速超过了8%。它并不能代表中国共产党一贯的文化政策和主张,而是一次重大的错误。(新华社记者叶书宏摄)【复活节岛】复活节岛面积约164平方公里,位于智利以西3700公里的遥远海面。

口腔颌面部间隙感染均为继发性,常为牙源性或腺源性感染扩散所致。对在市内六区和武清区范围内购买首套住房的非天津市户籍居民家庭,申请商业贷款首付比例不低于40%。  韩春雨表示,关于其实验不能重复的一些质疑是“非科学”的,一项科研成果是非对错,应该由科学本身来决定,需要时间和实践的检验。市区两套及以上住房者暂停购买。

上一篇文章强调了bean定义注册占Spring应用的半壁江山。而且详细介绍了两个重量级的注册bean定义的类。

今天就以SpringBoot为例,来看看整个SpringBoot应用的bean定义是如何注册进容器的。

先来看看经典的启动入口,如下图01:


可以看到调用的是run方法,并把
主类(main或primary)作为第一个参数出入。

接下来要做的事情,就是顺藤摸瓜,看看到底发生了什么,并确定下究竟哪些类被注册了bean定义

此时,我就是一个快乐的小侦探,OK,走起。

上面的调用走到了这里,如下图02:


可以看到把第一个参数(即主类)放入数组里,又调用了一个run方法,如下图03:


使用第一个参数(即主类)去调用了构造函数,得到了实例对象,然后又调用了实例的run方法。

顺着构造函数走下去,最终走到了这里,如图04:


发现最终主类被,放到Set<Class<?>>类型的primarySources字段中。

编程新说注通过搜索全类,发现这个字段除了刚刚放入的主类外,再没有放入其它类

接着再沿着run方法往下走,来到了这里,如下图05:


首先定义了一个容器类的变量,然后创建容器类的实例,就是通过反射调用构造函数了。

然后就是准备容器,进入方法里看看,如下图06:


在方法最后终于看到了我们期望的,即bean定义的注册。

发现要注册的资源是getAllSources()这个方法返回的,那就进去看看吧,如下图07:


看到资源来自于primarySources字段和sources字段。第一个字段上文已经讲了,只包含主类。

编程新说注:通过搜索全类,发现第二个字段sources是null因此它不包含资源

因此,真正获取到的用于注册bean定义的资源只有主类自己

那就打破砂锅走到底,继续吧。

再来看看load方法,如下图08:


使用刚刚获取到的资源创建了BeanDefinitionLoader类的实例。

这个类是SpringBoot定义的,类似于一个门面,因为它包含了所有注册bean定义的方式。

这个类就是最后一步了,因此来看看,如下图09:


首先是一个Object[]类型(之所以用Object,是因为资源类型有多种)的sources字段,用于存储刚刚获取的资源。

剩下四个都是用来注册bean定义的,其中两个上一篇已经讲过。剩余两个是处理xml和groovy的,一个已经过时,一个尚未流行。


最后再来看一眼,生成实例时调用的构造函数,如下图10:


就是对五个字段的赋值或实例化,并无特别之处。(其实是有的,先卖个关子)

接下来就是根据资源的具体类型,使用四个bean定义注册类中的一个来注册bean定义。

这一通分析下来,推导出来的结论是:

截止到目前,只有主类自己被注册了bean定义。

为了证明这一点,把日志级别改为DEBUG,如下图11:


可以看出在源码中,把资源数组进行了debug输出。

最终输出内容,如下图12:


发现确实只注册了主类自己,没有其它。和我们分析的一样,哈哈。

到现在prepareContext已经执行完毕了,接下来该执行的就是refreshContext了。

熟悉Spring容器的都知道,refresh其实就是容器的启动了。

因此最后得出一个结论,对于“常规”的SpringBoot应用:

在Spring容器启动前,只有应用的主类自己被注册了bean定义。

What,are you kidding me?

Of course not。

那其它的那些bean定义是何时及如何注册的呢?

且听下回分解。

最后来看看主类的bean定义信息,作为一个小小的彩蛋吧。

如下图13:


可以看出bean名称符合
生成规则,bean定义使用了CGLIB生成了代理。

bean的一些属性,单例、非抽象、非延迟加载、未明确定义自动装配方式、作为自动装配候选bean,非主要的等等。

bean定义的实现类是AnnotatedGenericBeanDefinition,可知是通过编程方式(而非jar包扫描)注册的bean定义。

预祝,看过本文的人都有所收获。若能转发一下,则求之不得。

 

>>> 品Spring系列文章 <<<

 

品Spring:帝国的基石

品Spring:bean定义上梁山

品Spring:实现bean定义时采用的“先进生产力”

品Spring:注解终于“成功上位”

品Spring:能工巧匠们对注解的“加持”

品Spring:SpringBoot和Spring到底有没有本质的不同?

品Spring:负责bean定义注册的两个“排头兵”

 

作者是工作超过10年的码农,现在任架构师。喜欢研究技术,崇尚简单快乐。追求以通俗易懂的语言解说技术,希望所有的读者都能看懂并记住。下面是公众号和知识星球的二维码,欢迎关注!

 

       

 


下载申博太阳娱乐直营网 菲律宾申博开户登入 菲律宾太阳网上娱乐登入 申博桌面安装版手机网页版 申博娱乐网登入 申博管理网直营
www.38333.com www.123456msc.com www.99msc.com 申博游戏平台直营网 百家乐微信支付充值 申博官网开户登入
申博会员登入直营网 太阳城申博登入 太阳城在线注册登入 菲律宾申博娱乐直营网 申博亚洲官网登入 申博娱乐网登入