上文讲述了在getSingleton()方法中,负责对应单例bean的创建, 即在doGetBean()最终会调用createBean()来创建bean。
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {if (logger.isTraceEnabled()) {logger.trace("Creating instance of bean '" + beanName + "'");}RootBeanDefinition mbdToUse = mbd;// Make sure bean class is actually resolved at this point, and// clone the bean definition in case of a dynamically resolved Class// which cannot be stored in the shared merged bean definition.//确保RootBeanDefinition定义中存在对应的bean class,否则抛异常Class<?> resolvedClass = resolveBeanClass(mbd, beanName);if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {mbdToUse = new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// Prepare method overrides.try {mbdToUse.prepareMethodOverrides();}catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),beanName, "Validation of method overrides failed", ex);}try {// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.//执行before-instantiation post-processors,在这个方法中执行了后置处理器InstantiationAwareBeanPostProcessor// 的postProcessBeforeInstantiation()方法,在bean实例化之前对bean进行处理,查阅相关资料,该扩展实现了aop相关功能,// 具体详细实现感兴趣读者可以自行研究Object bean = resolveBeforeInstantiation(beanName, mbdToUse);if (bean != null) {return bean;}}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,"BeanPostProcessor before instantiation of bean failed", ex);}try {//通常会继续到这一步,进行Bean相关的实例化、属性赋值、初始化等操作Object beanInstance = doCreateBean(beanName, mbdToUse, args);if (logger.isTraceEnabled()) {logger.trace("Finished creating instance of bean '" + beanName + "'");}return beanInstance;}catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {// A previously detected exception with proper bean creation context already,// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.throw ex;}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);}}......//确认存在指定的bean classprotected Class<?> resolveBeanClass(final RootBeanDefinition mbd, String beanName, final Class<?>... typesToMatch)throws CannotLoadBeanClassException {try {if (mbd.hasBeanClass()) {return mbd.getBeanClass();}if (System.getSecurityManager() != null) {return AccessController.doPrivileged((PrivilegedExceptionAction<Class<?>>) () ->doResolveBeanClass(mbd, typesToMatch), getAccessControlContext());}else {return doResolveBeanClass(mbd, typesToMatch);}}catch (PrivilegedActionException pae) {......}catch (ClassNotFoundException ex) {......}catch (LinkageError err) {......}}
createBean()方法中有两个重要的方法,resolveBeforeInstantiation()方法在bean实例化之前执行了后置处理器InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation()方法,在bean实例化之前对bean进行处理。如果resolveBeforeInstantiation()的返回值为null,则会继续执行doCreateBean()方法
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.BeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {//使用合适的策略创建一个实例, 策略包括工厂方法,适合的构造方法,或者直接初始化等instanceWrapper = createBeanInstance(beanName, mbd, args);}final Object bean = instanceWrapper.getWrappedInstance();Class<?> beanType = instanceWrapper.getWrappedClass();if (beanType != NullBean.class) {mbd.resolvedTargetType = beanType;}// Allow post-processors to modify the merged bean definition.synchronized (mbd.postProcessingLock) {if (!mbd.postProcessed) {try {//对指定bean应用MergedBeanDefinitionPostProcessors//AutowiredAnnotationBeanPostProcessor为其中一个实现,主要查找@Autowire等注解修饰的属性并缓存到injectionMetadataCache中applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);}catch (Throwable ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Post-processing of merged bean definition failed", ex);}mbd.postProcessed = true;}}// Eagerly cache singletons to be able to resolve circular references// even when triggered by lifecycle interfaces like BeanFactoryAware.//提前暴露标记,主要为了解决循环依赖问题,决定bean是否放入到singletonFactories中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");}//加入到singletonFactories中addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.Object exposedObject = bean;try {//填充bean的属性,首先执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法,判断是否需要填充属性//在AutowiredAnnotationBeanPostProcessor的父类InstantiationAwareBeanPostProcessorAdapter中的postProcessAfterInstantiation方法返回TRUE,继续填充属性,执行后续流程//后续填充属性流程调用InstantiationAwareBeanPostProcessor中的postProcessProperties方法填充属性,详细请看下文AutowiredAnnotationBeanPostProcessor的对应方法populateBean(beanName, mbd, instanceWrapper);//初始化方法,主要流程步骤如下:// 1. 执行invokeAwareMethods()方法,即执行实现Aware接口的方法,包括BeanNameAware、BeanClassLoaderAware、BeanFactoryAware// 2. 执行所有后置处理器的postProcessBeforeInitialization方法// 3. 执行invokeInitMethods()方法,即执行((InitializingBean) bean).afterPropertiesSet() 和invokeCustomInitMethod()方法(@Bean注解中的 String initMethod() default "";);// 4. 执行后置处理器的postProcessAfterInitialization方法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);}}//如果提前暴露,解决循环依赖相关代码,感兴趣读者可以自行分析// 此处相关逻辑分析跳过(~ ̄▽ ̄)~if (earlySingletonExposure) {Object earlySingletonReference = getSingleton(beanName, false);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 " +"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");}}}}// Register bean as disposable.try {//注册销毁bean回调方法,实现DisposableBean接口registerDisposableBeanIfNecessary(beanName, bean, mbd);}catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject;}
到此,bean的实例化、初始化过程已经完成,AutowiredAnnotationBeanPostProcessor类中对应的实现方法在上述流程中对应的步骤中会被执行,最后创建好的bean会被返回,单例bean会被存放到DefaultSingletonBeanRegistry的singletonObjects中。
附:AutowiredAnnotationBeanPostProcessor类中几个重要实现方法
//在applyMergedBeanDefinitionPostProcessors方法中会调用此方法,查找Autowiring相关注解修饰属性,并返回InjectionMetadata对象private InjectionMetadata findAutowiringMetadata(String beanName, Class<?> clazz, @Nullable PropertyValues pvs) {// Fall back to class name as cache key, for backwards compatibility with custom callers.String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());// Quick check on the concurrent map first, with minimal locking.InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey);if (InjectionMetadata.needsRefresh(metadata, clazz)) {synchronized (this.injectionMetadataCache) {metadata = this.injectionMetadataCache.get(cacheKey);if (InjectionMetadata.needsRefresh(metadata, clazz)) {if (metadata != null) {metadata.clear(pvs);}//查找@Autowired,@Value等修饰的属性metadata = buildAutowiringMetadata(clazz);this.injectionMetadataCache.put(cacheKey, metadata);}}}return metadata;}@Override//填充bean相关属性public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);try {metadata.inject(bean, beanName, pvs);}catch (BeanCreationException ex) {throw ex;}catch (Throwable ex) {throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);}return pvs;}
文章转载自测开技术笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




