本篇内容主要介绍SpringApplication启动过程中上下文刷新的第十一步finishBeanFactoryInitialization中最关键的创建单例Bean的步骤.它也包含了部分的Bean生命周期钩子调用.
AbstractAutowireCapableBeanFactory.doCreateBean
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
// 存放当前Bean的对象的包装类
BeanWrapper instanceWrapper = null;
// 如果该Bean是单例的,先从缓存中删掉该Bean.防止有重复
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
// 如果没有创建过,这里会先创建一个包含Bean的包装类实例
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// 这个就是Bean实例
Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
// 给BeanDefinition确定该Bean的类型
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
// Allow post-processors to modify the merged bean definition.
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
// 可以理解为Bean定义合并为RootBeanDefinition的后置处理器
// 执行实现MergedBeanDefinitionPostProcessor接口postProcessMergedBeanDefinition方法
// 主要是处理@PostConstruct,@Autowire,@Value,@Resource,@PreDestory等这些注解
// 注解处理完加入BeanDefinition中为后续初始化调用准备
// AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、
// InitDestroyAnnotationBeanPostProcessor、ScheduledAnnotationBeanPostProcessor、
// ApplicationListenerDetector看这些实现类名字就可以了解作用了
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of merged bean definition failed", ex);
}
mbd.postProcessed = true;
}
}
// 判断该Bean是否是单例,是否支持循环依赖,当前是否正在被创建
// 如果符合早期单例Bean被暴露的条件,将它放到三级缓存中暴露出去,防止循环依赖.
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
if (logger.isTraceEnabled()) {
logger.trace("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
// 添加至三级缓存中,会执行SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference方法去寻找到前期的Bean们
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
// 这个就是要初始化并且用以后面使用的Bean
Object exposedObject = bean;
try {
// 对bean进行填充: 给已经初始化的属性们赋值,在这里面完成依赖注入的相关内容
// 这里会执行postProcessAfterInstantiation判断是否需要赋值
// 如果需要则会执行postProcessProperties.
populateBean(beanName, mbd, instanceWrapper);
// 属性填充完,则执行该Bean初始化的实现流程
// 若实现了BeanNameAware, BeanClassLoaderAware,BeanFactoryAwareAware接口,则注入相关对象
// 遍历后置处理器,调用实现的postProcessBeforeInitialization方法
// 如果实现了initialzingBean,调用实现的 afterPropertiesSet(),如果配置了init-mothod,调用相应的init方法
// 遍历后置处理器,调用实现的postProcessAfterInitialization
// 这里没啥好说的,调用上面接口的实现方法回调.可看我的github上spring-learn.
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
catch (Throwable ex) {
if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
throw (BeanCreationException) ex;
}
else {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
}
}
// 如果该Bean支持循环依赖,从缓存中获取Bean对象(从三级缓存放入二级缓存).
if (earlySingletonExposure) {
Object earlySingletonReference = getSingleton(beanName, false);
// 检查是否和之前放入缓存中一致.不一致则需要抛出异常--之前依赖注入的该Bean非最终版本
if (earlySingletonReference != null) {
if (exposedObject == bean) {
exposedObject = earlySingletonReference;
}
else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
String[] dependentBeans = getDependentBeans(beanName);
Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
for (String dependentBean : dependentBeans) {
if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
actualDependentBeans.add(dependentBean);
}
}
if (!actualDependentBeans.isEmpty()) {
throw new BeanCurrentlyInCreationException(beanName,
"Bean with name '" + beanName + "' has been injected into other beans [" +
StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
"] in its raw version as part of a circular reference, but has eventually been " +
"wrapped. This means that said other beans do not use the final version of the " +
"bean. This is often the result of over-eager type matching - consider using " +
"'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
}
}
}
}
// Register bean as disposable.
try {
// 注册到需要执行销毁的Bean集合中
// 其中需要实现 DisposableBean 或 AutoCloseable接口并且是单例
// 会执行他们的destory或close方法
// 但在之前会执行DestructionAwareBeanPostProcessor的postProcessBeforeDestruction方法
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
}
return exposedObject;
}
AbstractAutowireCapableBeanFactory.createBeanInstance
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
// 确保类加载解析过
Class<?> beanClass = resolveBeanClass(mbd, beanName);
// 创建的Bean必须是public的
if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
}
// 如果有Supplier回调对象,则通过该对象回调方法创建实例
Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
if (instanceSupplier != null) {
return obtainFromSupplier(instanceSupplier, beanName);
}
// 使用工厂方法来进行bean的实例化
if (mbd.getFactoryMethodName() != null) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}
// 这里的操作当重复创建Bean时会比较快速.有已解析过标志位
// 在使用构造器创建实例后,Spring会将解析过后确定下来的构造器或工厂方法保存在缓存中,避免再次创建相同bean时再次解析
// 然后根据参数不同调用指定的构造器
boolean resolved = false;
boolean autowireNecessary = false;
if (args == null) {
synchronized (mbd.constructorArgumentLock) {
if (mbd.resolvedConstructorOrFactoryMethod != null) {
resolved = true;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
// 如果已经解析过并且是需要装配的,则调用autowireConstructor.否则调用默认构造器创建
if (resolved) {
if (autowireNecessary) {
return autowireConstructor(beanName, mbd, null, null);
}
else {
return instantiateBean(beanName, mbd);
}
}
// 没有解析过则先去解析获取该类的构造函数.再然后还是判断是用默认构造器构件还是交给Spring自动装配
// determineConstructorsFromBeanPostProcessors将自动扫描通过@Autowired/@Value注解的构造器从而可以完成构造器注入
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
// Preferred constructors for default construction?
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
return autowireConstructor(beanName, mbd, ctors, null);
}
// No special handling: simply use no-arg constructor.
return instantiateBean(beanName, mbd);
}
参考
AbstractBeanFactory#getBean()、doGetBean完成Bean的初始化、实例化,以及BeanPostProcessor后置处理器源码级详细分析