图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中获取对象。