用Debug进入IOC容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AopConfig.class);
进入Refresh方法
this.refresh();
调用this.finishBeanFactoryInitialization(beanFactory)方法
在遍历获取容器中所有Bean,依次获取
public void preInstantiateSingletons() throws BeansException { if (this.logger.isDebugEnabled()) { this.logger.debug("Pre-instantiating singletons in " + this); } List<String> beanNames = new ArrayList(this.beanDefinitionNames); Iterator var2 = beanNames.iterator();
GetBean——>DogetBean——>getSingleton
注意创建Bean不是一下就创建的
1)先从缓存中创建Bean,如果能获取到,说明Bean是被创建过的,直接使用
如果没有从缓存中获取,在创建Bean,只要创建的Bean都会被缓存
2)createBean,创建Bean
注意【BeanPostProcessor】是对象创建完成,初始化前后调用的
【InstantiationAwareBeanPostProcessor】是创建对象前调用的后置处理器
try {
beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
if (beanInstance != null) {
return beanInstance;
}
} catch (Throwable var8) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var8);
}
resolveBeforeInstantiation 希望后置处理器能返回一个代理对象
如果不能返回resolveBeforeInstantiation,就会执行
beanInstance = this.doCreateBean(beanName, mbdToUse, args);
if (this.logger.isDebugEnabled()) {
this.logger.debug("Finished creating instance of bean '" + beanName + "'");
}
resolveBeforeInstantiation 执行流程
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { Object bean = null; if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) { if (!mbd.isSynthetic() && this.hasInstantiationAwareBeanPostProcessors()) { Class<?> targetType = this.determineTargetType(beanName, mbd); if (targetType != null) { bean = this.applyBeanPostProcessorsBeforeInstantiation(targetType, beanName); if (bean != null) { bean = this.applyBeanPostProcessorsAfterInitialization(bean, beanName); } } } mbd.beforeInstantiationResolved = bean != null; }
后置处理器先尝试返回对象 this.applyBeanPostProcessorsBeforeInstantiation
拿到所有的后置处理器,如果是InstantiationAwareBeanPostProcessor处理器,执行postProcessBeforeInstantiation方法