代碼部分
說明
1.hasInstantiationAwareBeanPostProcessors()方法說明
其實是判斷 AbstractBeanFactory類的hasInstantiationAwareBeanPostProcessors中 是否標志有處理器( 5.3版本后其實是存放于BeanPostProcessorCache中,里面有四個List都是用于存放各種處理器的快取,不用多做在意,因為5.3之后都是一次性全部遍歷存完,優化了部分)
2.applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) 方法說明
該方法作用有兩種,一種是修改物件實體元資料(因為還沒被創建,所以元資料的改動會導致實體的改動),一種是提前回傳Bean物件(可以回傳自己定義的某個物件實體)
3.applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) 方法說明
該方法為初始化后的呼叫方法,為什么如果bean創建后要呼叫呢? 因為這個方法與AOP有關,在這個方法中進行AOP,是每個bean都要進行處理的方法,在這個方法內判斷需不需要進行動態代理,不需要就回傳本身,需要就進行動態代理,(具體可查看 Spring的AOP底層決議 )
代碼展示
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { Object bean = null; if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) { if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { Class<?> targetType = determineTargetType(beanName, mbd); if (targetType != null) { bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName); if (bean != null) { bean = applyBeanPostProcessorsAfterInitialization(bean, beanName); } } } mbd.beforeInstantiationResolved = (bean != null); } return bean; }
版本區別的記錄展示
applyBeanPostProcessorsBeforeInstantiation方法的差異(applyBeanPostProcessorsAfterInitialization方法類似,就寫出來了)
說明
1.改進后的版本明顯會比之前版本要快,而且會簡化一點,因為BeanPostProcessor的全部遍歷只會進行一次,而不是每個Bean都會全部遍歷一次,(這里面涉及到策略設計模式,本質上取決于,如果bean被創建出來了,后面的處理器其實就不會被呼叫)
2.以空間換時間的思維更加明顯,相比于名稱都要拿出全部的BeanPostProcessor進行遍歷(而且某些型別還不是需要的),不如按照型別進行劃分快取,雖說消耗了一定量的空間,但是能更快速的按照型別拿出需要的BeanPostProcessor進行遍歷處理
代碼展示
//5.3之前的版本 protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName); if (result != null) { return result; } } } return null; } //5.3之后的版本 static class BeanPostProcessorCache { final List<InstantiationAwareBeanPostProcessor> instantiationAware = new ArrayList<>(); final List<SmartInstantiationAwareBeanPostProcessor> smartInstantiationAware = new ArrayList<>(); final List<DestructionAwareBeanPostProcessor> destructionAware = new ArrayList<>(); final List<MergedBeanDefinitionPostProcessor> mergedDefinition = new ArrayList<>(); } BeanPostProcessorCache getBeanPostProcessorCache() { BeanPostProcessorCache bpCache = this.beanPostProcessorCache; if (bpCache == null) { bpCache = new BeanPostProcessorCache(); for (BeanPostProcessor bp : this.beanPostProcessors) { if (bp instanceof InstantiationAwareBeanPostProcessor) { bpCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bp); if (bp instanceof SmartInstantiationAwareBeanPostProcessor) { bpCache.smartInstantiationAware.add((SmartInstantiationAwareBeanPostProcessor) bp); } } if (bp instanceof DestructionAwareBeanPostProcessor) { bpCache.destructionAware.add((DestructionAwareBeanPostProcessor) bp); } if (bp instanceof MergedBeanDefinitionPostProcessor) { bpCache.mergedDefinition.add((MergedBeanDefinitionPostProcessor) bp); } } this.beanPostProcessorCache = bpCache; } return bpCache; } protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) { for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) { Object result = bp.postProcessBeforeInstantiation(beanClass, beanName); if (result != null) { return result; } } return null; }
applyBeanPostProcessorsAfterInitialization
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/507123.html
標籤:Java
上一篇:Java 函式式編程「一」
