當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring AbstractAutowireCapableBeanFactory
生活随笔
收集整理的這篇文章主要介紹了
Spring AbstractAutowireCapableBeanFactory
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
屬性
構(gòu)造函數(shù)
createBean
populateBean
initializeBean
Spring BeanFactory
Spring AbstractBeanFactory
Spring AbstractAutowireCapableBeanFactory
Spring DefaultListableBeanFactory
?
屬性
// bean的生成策略,默認CGLIB private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy(); // 解析策略的方法參數(shù) private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); // 嘗試解析循環(huán)引用 private boolean allowCircularReferences = true; // 在循環(huán)引用的情況下,是否需要注入一個原始的bean實例 private boolean allowRawInjectionDespiteWrapping = false; // 依賴項檢查和自動裝配時忽略的依賴項類型 private final Set<Class<?>> ignoredDependencyTypes = new HashSet<>(); // 依賴項檢查和自動裝配時忽略的依賴項接口 private final Set<Class<?>> ignoredDependencyInterfaces = new HashSet<>(); // 當前正在創(chuàng)建的bean private final NamedThreadLocal<String> currentlyCreatedBean = new NamedThreadLocal<>("Currently created bean"); // beanName和FactoryBean的映射 private final ConcurrentMap<String, BeanWrapper> factoryBeanInstanceCache = new ConcurrentHashMap<>(); // 類和候選方法映射 private final ConcurrentMap<Class<?>, Method[]> factoryMethodCandidateCache = new ConcurrentHashMap<>(); // 類和PropertyDescriptor的映射 private final ConcurrentMap<Class<?>, PropertyDescriptor[]> filteredPropertyDescriptorsCache = new ConcurrentHashMap<>();構(gòu)造函數(shù)
?
public AbstractAutowireCapableBeanFactory() {super(); //忽略BeanNameAware、BeanFactoryAware、BeanClassLoaderAware的依賴。ignoreDependencyInterface(BeanNameAware.class);ignoreDependencyInterface(BeanFactoryAware.class);ignoreDependencyInterface(BeanClassLoaderAware.class); } public AbstractAutowireCapableBeanFactory(@Nullable BeanFactory parentBeanFactory) {this();setParentBeanFactory(parentBeanFactory); }?
createBean
createBean實現(xiàn)父類AbstractBeanFactory的方法。
先調(diào)用?populateBean()注入屬性,再調(diào)用 initializeBean()執(zhí)行初始化操作。
?
public <T> T createBean(Class<T> beanClass) throws BeansException {// Use prototype bean definition, to avoid registering bean as dependent bean.RootBeanDefinition bd = new RootBeanDefinition(beanClass);bd.setScope(SCOPE_PROTOTYPE);bd.allowCaching = ClassUtils.isCacheSafe(beanClass, getBeanClassLoader());return (T) createBean(beanClass.getName(), bd, null);} protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {RootBeanDefinition mbdToUse = mbd;//解析class,Class<?> resolvedClass = resolveBeanClass(mbd, beanName);if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {//mbd沒有類信息,重新設(shè)值mbdToUse = new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// 方法覆蓋準備。lookup注解或者<lookup-method /> 標簽就是這里實現(xiàn)的,還有<replaced-method />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.// 前置處理器是否返回beanObject 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 {Object beanInstance = doCreateBean(beanName, mbdToUse, args);return beanInstance;}catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {throw ex;}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);}} protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// 實例化beanBeanWrapper instanceWrapper = null;單例模式(普通bean或FactoryBean),先從FactoryBean緩存中移除if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}// 返回空,說明不是FactoryBean,根據(jù)實際的策略生成BeanWrapperif (instanceWrapper == null) {instanceWrapper = createBeanInstance(beanName, mbd, args);}final Object bean = instanceWrapper.getWrappedInstance();Class<?> beanType = instanceWrapper.getWrappedClass();if (beanType != NullBean.class) {mbd.resolvedTargetType = beanType;}//MergedBeanDefinitionPostProcessor后置處理器修改合并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;}}// Eagerly cache singletons to be able to resolve circular references// even when triggered by lifecycle interfaces like BeanFactoryAware.//單例模式,在對象創(chuàng)建,但是未初始化時,加入緩存,用于解決循環(huán)引用。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");}// 此時還沒初始化完成,只是構(gòu)造了,先把ObjectFactory加入到singletonFactories,已經(jīng)可以產(chǎn)生bean了。addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.Object exposedObject = bean;try {// 實例化后,對bean各個屬性進行賦值populateBean(beanName, mbd, instanceWrapper);// 賦值后,調(diào)用init方法,InitializingBean這些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);// 循環(huán)依賴的情況if (earlySingletonReference != null) {// 判斷在initializeBean方法里有沒有被改變,被改變返回改變后的,沒有改變,從緩存中取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) {// 返回false說明依賴還沒實例化好if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {actualDependentBeans.add(dependentBean);}}// actualDependentBeans不為空,說明依賴還沒實例化好,拋異常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 {// 根據(jù)scope注冊DisposableBeanregisterDisposableBeanIfNecessary(beanName, bean, mbd);}catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject;}?
populateBean
對屬性進行賦值,主要為注入。
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {if (bw == null) {if (mbd.hasPropertyValues()) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");}else {// Skip property population phase for null instance.return;}}// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the// state of the bean before properties are set. This can be used, for example,// to support styles of field injection.// 看看InstantiationAwareBeanPostProcessors是否有注入值,如果已經(jīng)注入,就不繼續(xù)注入,直接返回if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {return;}}}}PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);//先準備屬性值,在最后再賦值int resolvedAutowireMode = mbd.getResolvedAutowireMode();if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {// 拷貝配置信息MutablePropertyValues newPvs = new MutablePropertyValues(pvs);// Add property values based on autowire by name if applicable.// 根據(jù)名稱注入if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {autowireByName(beanName, mbd, bw, newPvs);}// 根據(jù)類型注入if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {autowireByType(beanName, mbd, bw, newPvs);}pvs = newPvs;}// 容器是否有InstantiationAwareBeanPostProcessorsboolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();// 是否進行依賴檢查boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);PropertyDescriptor[] filteredPds = null;if (hasInstAwareBpps) {if (pvs == null) {pvs = mbd.getPropertyValues();}for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);if (pvsToUse == null) {if (filteredPds == null) {filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);}pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);if (pvsToUse == null) {return;}}pvs = pvsToUse;}}}if (needsDepCheck) {if (filteredPds == null) {// 過濾出需要依賴檢查的屬性filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);}// 檢查依賴關(guān)系,保證依賴項已初始化checkDependencies(beanName, mbd, filteredPds, pvs);}if (pvs != null) {// 此時才開始賦值applyPropertyValues(beanName, mbd, bw, pvs);}}initializeBean
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {//如果實例實現(xiàn)了Aware接口,則處理。invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {//先嘗試初始化。BeanPostProcessor處理。wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {//調(diào)用init方法invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;}從上面的實現(xiàn)可以看出:
具體實現(xiàn)如下:
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (Iterator it = getBeanPostProcessors().iterator(); it.hasNext();) {BeanPostProcessor beanProcessor = (BeanPostProcessor) it.next();result = beanProcessor.postProcessBeforeInitialization(result, beanName);}return result;}public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (Iterator it = getBeanPostProcessors().iterator(); it.hasNext();) {BeanPostProcessor beanProcessor = (BeanPostProcessor) it.next();result = beanProcessor.postProcessAfterInitialization(result, beanName);}return result;} protected void invokeInitMethods(String beanName, Object bean, RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean = (bean instanceof InitializingBean);if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {if (logger.isDebugEnabled()) {logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");}((InitializingBean) bean).afterPropertiesSet();}String initMethodName = (mbd != null ? mbd.getInitMethodName() : null);if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&!mbd.isExternallyManagedInitMethod(initMethodName)) {invokeCustomInitMethod(beanName, bean, initMethodName, mbd.isEnforceInitMethod());}}?
總結(jié)
以上是生活随笔為你收集整理的Spring AbstractAutowireCapableBeanFactory的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring AbstractBeanF
- 下一篇: Spring DefaultListab