springspring

spring源码文字叙述有助于理解源码2

2021-09-18  本文已影响0人  念䋛

另一个重要的方法finishBeanFactoryInitialization(beanFactory);
首先是遍历所有的beanDefintion,强转RootBeanDefinition,判断不是多例和懒加载,再判断是否是FactotyBean,如果是FactotyBean,bean名称加&前缀,最终存放在容器中的key是不带&,当获取bean的时候,带&是获取FactotyBean本身,如果获取getObject返回的A类,需要通过A类.class获取不能通过名称A名称, 第一次获取A类时,需要调用getObject方
法,并缓存到FactoryBeanRegistrySupport成员变量factoryBeanObjectCache中,再次获取时,不需要getObject了,如果不是FactoryBean的子类,首先通过别名获取真正bean的名称,
判断一级缓存中是否已经存在bean,如果存在则直接返回,判断是否时单例,单例则继续,调用getSingleton方法,lambda表达式,调用createBean方法,这里会调用第一个后置处理器
InstantiationAwareBeanPostProcessor,可直接返回bean,aop就是使用了这个后置处理器,
调用doCreateBean方法,通过createBeanInstance方法定义bean的包装类instanceWrapper,
调用SmartInstantiationAwareBeanPostProcessor后置处理器,获取使用哪个构造函数创建bean,如果构造函数中含有入参,直接从容器中获取bean,这样不能解决构造函数入参的循环依赖,获取包装类之后调用InstantiationAwareBeanPostProcessor,将成员变量标注
@autowired,@value@Resource进行预赋值,并没有真正的赋值,调用populateBean方法,
通过InstantiationAwareBeanPostProcessor后置处理器赋值的, populateBean紧接着调用
initializeBean方法调用绝大多数的aware,并且判断bean是否继承了InitializingBean接口,如果是调用afterPropertiesSet方法,在调用InitializingBean的afterPropertiesSet前后分别调用BeanPostProcessor的postProcessBeforeInitialization,postProcessAfterInitialization两个方法, BeanPostProcessor也是最后一个bean的后置处理器.

上一篇 下一篇

猜你喜欢

热点阅读