Spring容器如何创建bean和初始化bean
·
AbstractApplicationContext.class
public void refresh() throws BeansException, IllegalStateException { synchronized(this.startupShutdownMonitor) { .... try { //实现剩余的非懒加载的单例 this.finishBeanFactoryInitialization(beanFactory); this.finishRefresh(); } catch (BeansException var9) { ... } finally { .. } } }//实现了剩余Bean的实力化 protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { if (beanFactory.containsBean("conversionService") && beanFactory.isTypeMatch("conversionService", ConversionService.class)) { beanFactory.setConversionService((ConversionService)beanFactory.getBean("conversionService", ConversionService.class)); } if (!beanFactory.hasEmbeddedValueResolver()) { beanFactory.addEmbeddedValueResolver((strVal) -> { return this.getEnvironment().resolvePlaceholders(strVal); }); } String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false); String[] var3 = weaverAwareNames; int var4 = weaverAwareNames.length; for(int var5 = 0; var5 < var4; ++var5) { String weaverAwareName = var3[var5]; //获取Bean this.getBean(weaverAwareName); } beanFactory.setTempClassLoader((ClassLoader)null); beanFactory.freezeConfiguration(); beanFactory.preInstantiateSingletons(); }
AbstractBeanFactory.class
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException { // 去除name上存在的工厂bean的前缀 final String beanName = transformedBeanName(name); Object bean; // 快速判断单例缓存中是否存在该bean,如果存在则返回单例bean;否则返回null Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { ... // 从单例缓存中获取单例bean bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } else { // 判断该bean是否存在父工厂 BeanFactory parentBeanFactory = getParentBeanFactory(); if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { //如果存在父工厂,则按照父工厂的实现来创建该实例 } // 标记该bean已经被创建 if (!typeCheckOnly) { markBeanAsCreated(beanName); } try { // 返回bean的定义信息,包括bean的scope、依赖、是否进行懒加载等定义 final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); checkMergedBeanDefinition(mbd, beanName, args); // 确保初始化所有依赖这个bean的bean String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dep : dependsOn) { ... registerDependentBean(dep, beanName); getBean(dep); } } // 开始创建这个bean,注意这里使用的lambda表达式,传入的是一个AbstracBeanFactory if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { ... } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } else if (mbd.isPrototype()) { // 该bean定义了原型模式,创建该bean Object prototypeInstance = null; try { beforePrototypeCreation(beanName); prototypeInstance = createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); } else { String scopeName = mbd.getScope(); final Scope scope = this.scopes.get(scopeName); if (scope == null) { ... } try { Object scopedInstance = scope.get(beanName, () -> { beforePrototypeCreation(beanName); try { return createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } }); bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); } catch (IllegalStateException ex) { ... } } } catch (BeansException ex) { ... } } if (requiredType != null && !requiredType.isInstance(bean)) { try { T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType); if (convertedBean == null) { ... } return convertedBean; } catch (TypeMismatchException ex) { ... } } return (T) bean; }
DefaultSingletonBeanRegistry.class
@Nullable protected Object getSingleton(String beanName, boolean allowEarlyReference) { /// singletonObjects是一个单例缓存,是一个ConcurrentHashMap Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) { synchronized(this.singletonObjects) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) { ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return singletonObject; } public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { Assert.notNull(beanName, "Bean name must not be null"); ///bean的获取,是要获得“单例缓存”的锁,否则无法操作bean的获取 synchronized(this.singletonObjects) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { ..... } this.beforeSingletonCreation(beanName); boolean newSingleton = false; boolean recordSuppressedExceptions = this.suppressedExceptions == null; if (recordSuppressedExceptions) { this.suppressedExceptions = new LinkedHashSet(); } try { //尝试从工厂中获取Bean singletonObject = singletonFactory.getObject(); newSingleton = true; } catch (IllegalStateException var16) { ... } catch (BeanCreationException var17) { .. } finally { if (recordSuppressedExceptions) { this.suppressedExceptions = null; } //单例Bean创建之后的回调对象 this.afterSingletonCreation(beanName); } if (newSingleton) { this.addSingleton(beanName, singletonObject); } } return singletonObject; } }
AbstractAutowireCapableBeanFactory.class
/* 该类的中心方法:创建bean实例,实例化bean实例,应用bean的后置处理器 */ @Override protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { RootBeanDefinition mbdToUse = mbd; try { // 调用实例化前的后置处理器,在这个后置处理器中可以对bean进行处理,可以返回由后置处理器处理的bean而不是被实例化的bean。 // 换句话说就是这里可以拦截住bean的实例化 Object bean = resolveBeforeInstantiation(beanName, mbdToUse); if (bean != null) { return bean; } } ... } /* 正在的创建一个bean,并且按照配置文件的配置来实例化该bean。如果没有初始化前的后置处理器的调用,则调用该方法。 */ protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // 创建一个包装类,用于包装真正要创建的bean。 BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { // 使用适当的实例化策略,为bean设置默认初始值 // 也就是name为null,age为0。此时instanceWrapper任然还只是一个包装bean,并不是一个真正意义上的person类bean。 instanceWrapper = createBeanInstance(beanName, mbd, args); } // 终于, 获得了我们想要的person类bean。 // 只需要在BeanWrapper里取出WrapperInstance即可。 // 接下来就是要拿这个创建好的bean和BeanDefinition进行实例化了。 final Object bean = instanceWrapper.getWrappedInstance(); // 获取bean的类型 Class<?> beanType = instanceWrapper.getWrappedClass(); if (beanType != NullBean.class) { mbd.resolvedTargetType = beanType; } // 调用后置处理器去修改bean的定义信息。 synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { try { applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); } catch (Throwable ex) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", ex); } mbd.postProcessed = true; } } boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { ... // 先快速的给bean实例化,然后将bean添加到单例工厂中。这里的单例工厂实际上就是一个Map addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); } // 实例化一个真正使用的bean。 Object exposedObject = bean; try { populateBean(beanName, mbd, instanceWrapper); exposedObject = initializeBean(beanName, exposedObject, mbd); } catch (Throwable ex) { ... } if (earlySingletonExposure) { ... } // Register bean as disposable. try { registerDisposableBeanIfNecessary(beanName, bean, mbd); } catch (BeanDefinitionValidationException ex) { ... } return exposedObject; } /* 对创建出的Bean进行赋值填充。 */ protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { ... // 取出BeanDefinition里的属性值 PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null); // 如果设置的是自动装配模式,则由自动装配来进行赋值 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(pvs); // 通过bean名自动装配 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) { autowireByName(beanName, mbd, bw, newPvs); } // 通过bean类型自动装配 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { autowireByType(beanName, mbd, bw, newPvs); } pvs = newPvs; } boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors(); boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE); if (hasInstAwareBpps || needsDepCheck) { .... } // 这里的PropertyValues已经包含了bean字段属性的设置值了 if (pvs != null) { // 对bean进行赋值 applyPropertyValues(beanName, mbd, bw, pvs); } } /* 应用给定的属性值,并使用深拷贝对bean进行填充赋值。 */ protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) { if (pvs.isEmpty()) { return; } MutablePropertyValues mpvs = null; // 源属性值 List<PropertyValue> original; if (System.getSecurityManager() != null) { if (bw instanceof BeanWrapperImpl) { ((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext()); } } if (pvs instanceof MutablePropertyValues) { mpvs = (MutablePropertyValues) pvs; if (mpvs.isConverted()) { try { bw.setPropertyValues(mpvs); return; } catch (BeansException ex) { ... } } original = mpvs.getPropertyValueList(); } else { original = Arrays.asList(pvs.getPropertyValues()); } TypeConverter converter = getCustomTypeConverter(); if (converter == null) { converter = bw; } BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter); // 拷贝值;创建一个深拷贝副本,应用于任何bean引用此bean的情况。 List<PropertyValue> deepCopy = new ArrayList<>(original.size()); boolean resolveNecessary = false; for (PropertyValue pv : original) { if (pv.isConverted()) { deepCopy.add(pv); } else { String propertyName = pv.getName(); Object originalValue = pv.getValue(); Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue); Object convertedValue = resolvedValue; boolean convertible = bw.isWritableProperty(propertyName) && !PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName); if (convertible) { convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter); } // 可能在合并的bean定义中存储转换后的值,以避免为每个创建的bean实例重新转换。 if (resolvedValue == originalValue) { if (convertible) { pv.setConvertedValue(convertedValue); } deepCopy.add(pv); } else if (convertible && originalValue instanceof TypedStringValue && !((TypedStringValue) originalValue).isDynamic() && !(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) { pv.setConvertedValue(convertedValue); deepCopy.add(pv); } else { resolveNecessary = true; deepCopy.add(new PropertyValue(pv, convertedValue)); } } } if (mpvs != null && !resolveNecessary) { mpvs.setConverted(); } // 将深拷贝属性数组填充到beanWrapper中。这里就真正的将属性值填充到了bean上,实现了 try { bw.setPropertyValues(new MutablePropertyValues(deepCopy)); } catch (BeansException ex) { ... } }
这里我引用原作者的图像,很明显能看出来,Bean的创建和属性注入的执行图,发现真正的对bean赋值填充是在AbstractAutowireCapableBeanFactory.class类里的applyPropertyValues方法里的,并且是通过对原属性值进行了一次深拷贝,然后将深拷贝后的属性值填充到bean里的,这样就完成了对Bean的实例化和属性注入的过程。
更多推荐





所有评论(0)