Spring IOC容器依赖注入
调用applicationContext.getBean()
org.springframework.context.support.AbstractApplicationContext.getBean();
getBeanFactory().getBean(name)方法;
org.springframework.beans.factory.support.AbstractBeanFactory.getBean();
doGetBean(name, null, null, false)方法;
判断是否有手工注册的singletons bean:Object sharedInstance = getSingleton(beanName);
调用getObjectForBeanInstance返回bean对象:org.springframework.beans.factory.support.getObjectForBeanInstance()
先,object = getCachedObjectForFactoryBean(beanName);
为空,object = getObjectFromFactoryBean(factory, beanName, !synthetic);
获取parentBeanFactory,获取beanName的BeanDefinition。
Bean定义:mbd = getMergedLocalBeanDefinition(beanName)
找到BeanDefinition的依赖:dependsOn = mbd.getDependsOn();
注入依赖:registerDependentBean(dep, beanName);
根据依赖,创建bean示例:
判断bean的类型:Singleton、prototype、其他scope
Singleton类型:sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}catch (BeansException ex) {
destroySingleton(beanName);
throw ex;
}});
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean()方法:
调用beanInstance = doCreateBean(beanName, mbdToUse, args);
调用instanceWrapper = createBeanInstance(beanName, mbd, args);确定使用哪种方式实例化bean
根据配置方式:return obtainFromSupplier(instanceSupplier, beanName);
使用定义factoryMethod:return instantiateUsingFactoryMethod(beanName, mbd, args);
确定构造方法:
使用指定的:autowireConstructor(beanName, mbd, ctors, args);
使用无参数构造:instantiateBean(beanName, mbd);
填充bean属性:populateBean(beanName, mbd, instanceWrapper);
注入熟悉autowireByType、autowireByName(beanName, mbd, bw, newPvs)
实例化bean:exposedObject = initializeBean(beanName, exposedObject, mbd);
触发相关aware接口:invokeAwareMethods(beanName, bean);
触发beanPostProcessor前置处理:wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
触发((InitializingBean) bean).afterPropertiesSet();
Spring IOC容器依赖注入全过程分析
最新推荐文章于 2022-10-25 09:48:18 发布