AbstractAutowireCapableBeanFactory 类对容器生成的Bean 添加后置处理器
生活随笔
收集整理的這篇文章主要介紹了
AbstractAutowireCapableBeanFactory 类对容器生成的Bean 添加后置处理器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
BeanPostProcessor 后置處理器的調用發生在Spring IOC 容器完成對Bean 實例對象的創建和屬性的依賴注入完成之后,在對Spring 依賴注入的源碼分析過程中我們知道,當應用程序第一次調用getBean()方法(lazy-init 預實例化除外)向Spring IOC 容器索取指定Bean 時觸發Spring IOC 容器創建Bean 實例對象并進行依賴注入的過程, 其中真正實現創建Bean 對象并進行依賴注入的方法是AbstractAutowireCapableBeanFactory 類的doCreateBean()方法,主要源碼如下:
//真正創建Bean的方法 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.//封裝被創建的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.//調用PostProcessor后置處理器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;}}// Eagerly cache singletons to be able to resolve circular references// even when triggered by lifecycle interfaces like BeanFactoryAware.//向容器中緩存單例模式的Bean對象,以防循環引用boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName));if (earlySingletonExposure) {if (logger.isDebugEnabled()) {logger.debug("Eagerly caching bean '" + beanName +"' to allow for resolving potential circular references");}//這里是一個匿名內部類,為了防止循環引用,盡早持有對象的引用addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.//Bean對象的初始化,依賴注入在此觸發//這個exposedObject在初始化完成之后返回作為依賴注入完成后的BeanObject exposedObject = bean;try {//將Bean實例對象封裝,并且Bean定義中配置的屬性值賦值給實例對象populateBean(beanName, mbd, instanceWrapper);//初始化Bean對象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) {//獲取指定名稱的已注冊的單例模式Bean對象Object earlySingletonReference = getSingleton(beanName, false);if (earlySingletonReference != null) {//根據名稱獲取的已注冊的Bean和正在實例化的Bean是同一個if (exposedObject == bean) {//當前實例化的Bean初始化完成exposedObject = earlySingletonReference;}//當前Bean依賴其他Bean,并且當發生循環引用時不允許新創建實例對象else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {String[] dependentBeans = getDependentBeans(beanName);Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);//獲取當前Bean所依賴的其他Beanfor (String dependentBean : dependentBeans) {//對依賴Bean進行類型檢查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.//注冊完成依賴注入的Beantry {registerDisposableBeanIfNecessary(beanName, bean, mbd);}catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject; }從上面的代碼中我們知道,為Bean 實例對象添加BeanPostProcessor 后置處理器的入口的是initializeBean()方法。
?
總結
以上是生活随笔為你收集整理的AbstractAutowireCapableBeanFactory 类对容器生成的Bean 添加后置处理器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BeanPostProcessor 源码
- 下一篇: initializeBean()方法为容