Spring 源码九(属性填充)

图1-0

图1-1

图1-2

图1-3

图1

图2

 图3

图4

此时的beanFactory是DefalutListableBeanFactory。所以执行这个类的preInterantiateSingletons()方法。 

图5

743行拿出所有的bd名称。

754 行判断是否有父的bd 。如果有父的bd。把父的bd和子的bd进行合并。图6 ,7,8,9,10举例说明。这个不重要,只有在xml中有这种写法。springBoot中已经淘汰了。例如index 不是抽象类,是单例,不是懒加载 会进第一个 if, 但是 index 没有包含& 所以不是 factoryBean .所以会进入下面的else分支中。

图11

图12

 

看上面注释。

那一种情况不为空呢,第二次调用的时候,或者是lazy的时候。 

 

sharredInstance不等于null的情况。

sharredInstance等于null的时候,如果是原型的话报错。判断我们正在创建的类是不是原型的。这段情况一般不会发生的,因为前面有判断是singleon的。  spring 在创建一个bean的时候,会往一个list中放一个beanName ,标识这个类正在创建。有一个属性currentlyInCreation表示正在创建。

 

因为只有我们设置了parentBeanFactory父类的工厂方法才会进这个代码,一般没有不重要。一般情况下是空。

 添加到aleradyCreated的set中标识已经创建了(图16)。不重要。

 

获取bd。校验bd。  bd 中获取依赖dependsOn ,如果有依赖。率先示例化他的依赖。目前index没有依赖。所以为空。

如果是单例的调getSingleton 。index是单例的。所以今日362行  。注意这个getSingLeton和上次那个getSingLeton不一样。图19。 createBean() 图 21

 

图13

图14

图15

图16

图17

图18

图19

 

 

 

图20

 

图20

两个getSingleton() 的区别。 第一个getSingleton()  == null 的时候,还要判断 isSingletonCurrentlyInCreation  判断这个类是不是正在创建,所以返回空。第二个getSingleton() 是经过各种densponsOn验证以后,并在set添加正在创建,如果为空则创建对象。使用new对象。而上一个主要用于beanFactory.getBean()。

图21

通过bd ,得到一个indexService这样的李。不重要。

lookup-menthod 和replace-method ,spring统称为method overriders 

如果在创建bean之前或者初始化之前, 通过执行后置处理器的前置方法,和后置方法如果能返回一个不为空的bean就直接返回,终止后续操作。不在示例化bean,和填充属性了,自动装配。

创建bean 。图 25

 图22

图23

如果你想返回的对象是一个广对象,不需要填充属性等操作,直接返回,就实现这个接口InstantiationAwareBeanPostProcessor

图24

InstantiationAwareBeanPostProcessor 这个类有三个方法,加上继承父类的一共有五个方法,我们可以随便实现那个方法,然后把对象new 出去返回,那么spring就不会做后续的实例化,填充属性的,没有任何依赖操作。主要是spring内部使用的。程序员使用无意义。InstantiationAwareBeanPostProcessor是内部后置处理器。 

图25

538行如果是单例,从factoryBeanInstanceCache,缓存中移除。

 创建bean示例。

获取的instanceWrapper 对象,然后调用他的getWrappedInstance() 方法返回他的bean对象。 

图25-0

new 出来对象以后,首先放在singletonFactories这个map中一个,放registeredSingletons的list中一个。earlySingletonOjbects中移除。

图25-1

填充属性。

 

continueWitehPropertyPopulation 需不要spring 帮我们设置属性。 如果我们去示例化一个InstantiationAwareBeanPostProcessor 这样一个接口,那么会把continueWitehPropertyPopulation 设置为false 。spring就不会帮我们设置属性了。

pvs不会有值是spring 内部设置的。

判断注入类型,spring 默认既不是by_type,也不是by_name。

要不要处理Aware这个接口,要不要深度检查(引用里面再引用)当然需要。

 

后置处理器是AutowiredAnnotationBeanPostProcessor 来处理注入依赖。

图26

图27 

 

 

 

 

图28

图29

chenckedElemnets 是luban的属性。target是indexService。 indexService 类里面有luban的属性,可以有多个,依次遍历elements.

图30

 

field是属性 IndexService下的luban ,bean对象是IndexService

图31

 拿出的value值IndexService类和 Luban类的属性indexService类型进行匹配。图56

 

填充属性。 为luban 的bean的属性indexService 填充属性 value 的值为IndexService类型。

图31-0

判断依赖的类型。

图32

shortcut为空不重要。 

 type 为依赖的类型,IndexService的依赖的的类型为 Luban。value值是空的。如果不为空就把这个值赋值给他。

 

 

从注解中取出 

把map中key和value拿出来。 从spring中获取Luban对象,并且是Luban对象中依赖好IndexService的对象。很关键图33。

图33

图34

 图35

图35为doGetBean方法内部

图36

图37

此时的singletonObjects为空,因为此时还没有放到这个里面。allowearlyReference 为true允许暴露。此时的 singletonObject为空因为从来没有放进去过。

图38

 

当第一次getBean(y)后调doCreateBean(x) 方法执行完后回 放到singletonsCurrentlyInCreation 中一个标记为正在创建,把一个new好的bean放在一个singletonFactories 中。 然后只是populateBean(y),resolveDependency(). resolveCandidate() 方法时候第二次调用getSingleton()方法此时这个singletonsCurrentlyInCreation已经标记为正在创建 ,然后会通过singletonFactories中判断有没有这个bean 如果有就直接从singletonFactories中获取 获取之后把bean放在 earlySingletonObjects 中,同时从singletonFactories移除这个bean。.第一次调用getBean 方法的 getSingleton()不会进图37的这个183行 ,因为isSingletonsCurrentlyInCreation 等于false。

图39

图40

 

图50  doCreateBean方法的内容.

获取new 的bean; 

 

图51

把bean 添加到 singletonFactories中。  创建对象后移除 earlySingletonObjects对象的值。

 

图52  gitSingleton ()方法中。

 

图52  gitSingleton ()方法中。

图53-0

 

图53-1

图54

图55

这个earlySingletonObjects 起到什么作用。earlySingletonObjects 在什么情况下被用了呢,? 在从getBean()获取对象 value后。判断这个value的类型,和属性类型是否一致的时候才会用到。图31。图56,图57,图58, 什么时候放进去值的呢,是在doCreateBean方法中添加到singletonFactoris的时候,放入的。图37 。earlySingletonObjects 对象什么时候被移除的呢, 图51

图56

为什么要匹配呢,因为有可能在这个中途中把这个变量改了。有可能进行代理什么的把他改变了。 

图57

图58

 图58  这个时候才从earlySingletonObjects中获取对象。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值