国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spring啟動(dòng)流程 (2) Bean實(shí)例化流程

這篇具有很好參考價(jià)值的文章主要介紹了spring啟動(dòng)流程 (2) Bean實(shí)例化流程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本文通過閱讀Spring源碼,分析Bean實(shí)例化流程。

Bean實(shí)例化入口

上一篇文章已經(jīng)介紹,Bean實(shí)例化入口在AbstractApplicationContext類的finishBeanFactoryInitialization方法:

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
	// Initialize conversion service for this context.
	if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
			beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
		beanFactory.setConversionService(
				beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
	}

	// Register a default embedded value resolver if no bean post-processor
	// (such as a PropertyPlaceholderConfigurer bean) registered any before:
	// at this point, primarily for resolution in annotation attribute values.
	if (!beanFactory.hasEmbeddedValueResolver()) {
		beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
	}

	// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
	String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
	for (String weaverAwareName : weaverAwareNames) {
		getBean(weaverAwareName);
	}

	// Stop using the temporary ClassLoader for type matching.
	beanFactory.setTempClassLoader(null);

	// Allow for caching all bean definition metadata, not expecting further changes.
	beanFactory.freezeConfiguration();

	// Instantiate all remaining (non-lazy-init) singletons.
	// 實(shí)例化Bean
	beanFactory.preInstantiateSingletons();
}

Bean實(shí)例化流程

public void preInstantiateSingletons() throws BeansException {

	// Iterate over a copy to allow for init methods which in turn register new bean definitions.
	// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
	List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

	// Trigger initialization of all non-lazy singleton beans...
	for (String beanName : beanNames) {
		RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
		// 判斷非抽象,單例且非懶加載
		if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
			// 判斷FactoryBean
			if (isFactoryBean(beanName)) {
				// 使用"&beanName"格式作為beanName去創(chuàng)建Bean實(shí)例
				Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
				if (bean instanceof FactoryBean) {
					FactoryBean<?> factory = (FactoryBean<?>) bean;
					boolean isEagerInit;
					if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
						isEagerInit = AccessController.doPrivileged(
								(PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
								getAccessControlContext());
					} else {
						isEagerInit = (factory instanceof SmartFactoryBean &&
								((SmartFactoryBean<?>) factory).isEagerInit());
					}
					if (isEagerInit) {
						getBean(beanName);
					}
				}
			} else {
				// 普通的Bean
				getBean(beanName);
			}
		}
	}

	// Trigger post-initialization callback for all applicable beans...
	// 此分支暫時(shí)不做分析
	for (String beanName : beanNames) {
		Object singletonInstance = getSingleton(beanName);
		if (singletonInstance instanceof SmartInitializingSingleton) {
			SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
			if (System.getSecurityManager() != null) {
				AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
					smartSingleton.afterSingletonsInstantiated();
					return null;
				}, getAccessControlContext());
			} else {
				smartSingleton.afterSingletonsInstantiated();
			}
		}
	}
}

getBean(beanName)方法

public Object getBean(String name) throws BeansException {
	return doGetBean(name, null, null, false);
}

protected <T> T doGetBean(
		String name, Class<T> requiredType, Object[] args, boolean typeCheckOnly)
		throws BeansException {

	// 去除name的&前綴
	String beanName = transformedBeanName(name);
	Object bean;

	// 依次從singletonObjects, earlySingletonObjects, singletonFactories獲取單例Bean
	// 如果找到了就不需要?jiǎng)?chuàng)建了
	Object sharedInstance = getSingleton(beanName);
	if (sharedInstance != null && args == null) {
		// Get the object for the given bean instance,
		// either the bean instance itself or its created object in case of a FactoryBean.
		// name參數(shù)是調(diào)用getBean方法時(shí)傳遞的原始BeanName,可能前綴&符用于獲取FactoryBean實(shí)例
		// beanName參數(shù)是去除&符前綴后的BeanName
		bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
	} else {
		// Fail if we're already creating this bean instance:
		// We're assumably within a circular reference.
		if (isPrototypeCurrentlyInCreation(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}

		// 如果當(dāng)前BeanFactory沒有指定Bean則從父級(jí)BeanFactory獲取Bean實(shí)例
		BeanFactory parentBeanFactory = getParentBeanFactory();
		if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
			// Not found -> check parent.
			String nameToLookup = originalBeanName(name);
			if (parentBeanFactory instanceof AbstractBeanFactory) {
				return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
						nameToLookup, requiredType, args, typeCheckOnly);
			} else if (args != null) {
				// Delegation to parent with explicit args.
				return (T) parentBeanFactory.getBean(nameToLookup, args);
			} else if (requiredType != null) {
				// No args -> delegate to standard getBean method.
				return parentBeanFactory.getBean(nameToLookup, requiredType);
			} else {
				return (T) parentBeanFactory.getBean(nameToLookup);
			}
		}

		// whether the instance is obtained for a type check, not for actual use
		if (!typeCheckOnly) {
			markBeanAsCreated(beanName);
		}

		try {
			RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
			checkMergedBeanDefinition(mbd, beanName, args);

			// 創(chuàng)建DependsOn的Bean
			String[] dependsOn = mbd.getDependsOn();
			if (dependsOn != null) {
				for (String dep : dependsOn) {
					// 判斷循環(huán)依賴
					if (isDependent(beanName, dep)) {
						throw new BeanCreationException(
                            mbd.getResourceDescription(), beanName, "循環(huán)依賴");
					}
					registerDependentBean(dep, beanName);
					try {
						getBean(dep);
					} catch (NoSuchBeanDefinitionException ex) {
						throw new BeanCreationException(
                            mbd.getResourceDescription(), beanName, "依賴的Bean不存在", ex);
					}
				}
			}

			// 此分支獲取單例Bean
			if (mbd.isSingleton()) {
				sharedInstance = getSingleton(beanName, () -> {
					try {
						return createBean(beanName, mbd, args);
					} catch (BeansException ex) {
						// Explicitly remove instance from singleton cache: It might have been put there
						// eagerly by the creation process, to allow for circular reference resolution.
						// Also remove any beans that received a temporary reference to the bean.
						destroySingleton(beanName);
						throw ex;
					}
				});
				bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
			} else if (mbd.isPrototype()) {
				// 此分支獲取Prototype類型的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();
				if (!StringUtils.hasLength(scopeName)) {
					throw new IllegalStateException("No scope name defined for bean ′" + beanName + "'");
				}
				Scope scope = this.scopes.get(scopeName);
				if (scope == null) {
					throw new IllegalStateException("No Scope registered for scope name");
				}
				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) {
					throw new BeanCreationException(
                        beanName, "Scope is not active for the current thread", ex);
				}
			}
		} catch (BeansException ex) {
			cleanupAfterBeanCreationFailure(beanName);
			throw ex;
		}
	}

	// 類型轉(zhuǎn)換
	if (requiredType != null && !requiredType.isInstance(bean)) {
		try {
			T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
			if (convertedBean == null) {
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
			return convertedBean;
		} catch (TypeMismatchException ex) {
			throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
		}
	}
	return (T) bean;
}

創(chuàng)建/獲取單例Bean

sharedInstance = getSingleton(beanName, () -> {
	try {
		return createBean(beanName, mbd, args);
	} catch (BeansException ex) {
		// Explicitly remove instance from singleton cache: It might have been put there
		// eagerly by the creation process, to allow for circular reference resolution.
		// Also remove any beans that received a temporary reference to the bean.
		destroySingleton(beanName);
		throw ex;
	}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);

getSingleton

返回指定beanName的(原始)單例對(duì)象,如果沒有則創(chuàng)建一個(gè)新對(duì)象:

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
	synchronized (this.singletonObjects) {
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null) {
			// Singleton bean creation not allowed while singletons of this factory are in destruction 
			// (Do not request a bean from a BeanFactory in a destroy method implementation!)
			if (this.singletonsCurrentlyInDestruction) {
				throw new BeanCreationNotAllowedException(beanName, "");
			}
			beforeSingletonCreation(beanName);
			boolean newSingleton = false;
			boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
			if (recordSuppressedExceptions) {
				this.suppressedExceptions = new LinkedHashSet<>();
			}
			try {
				// 此處需要返回去看createBean(beanName, mbd, args)的代碼
				singletonObject = singletonFactory.getObject();
				newSingleton = true;
			} catch (IllegalStateException ex) {
				// Has the singleton object implicitly appeared in the meantime ->
				// if yes, proceed with it since the exception indicates that state.
				singletonObject = this.singletonObjects.get(beanName);
				if (singletonObject == null) {
					throw ex;
				}
			} catch (BeanCreationException ex) {
				if (recordSuppressedExceptions) {
					for (Exception suppressedException : this.suppressedExceptions) {
						ex.addRelatedCause(suppressedException);
					}
				}
				throw ex;
			} finally {
				if (recordSuppressedExceptions) {
					this.suppressedExceptions = null;
				}
				afterSingletonCreation(beanName);
			}
			if (newSingleton) {
				// 將創(chuàng)建的單例放入單例池
				addSingleton(beanName, singletonObject);
			}
		}
		return singletonObject;
	}
}

protected void addSingleton(String beanName, Object singletonObject) {
	synchronized (this.singletonObjects) {
		this.singletonObjects.put(beanName, singletonObject);
		this.singletonFactories.remove(beanName);
		this.earlySingletonObjects.remove(beanName);
		this.registeredSingletons.add(beanName);
	}
}

createBean

創(chuàng)建Bean實(shí)例、填充屬性、調(diào)用后置處理器等:文章來源地址http://www.zghlxwxcb.cn/news/detail-514398.html

protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args)
		throws BeanCreationException {

	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.
	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 {
		// 調(diào)用BeanPostProcessor處理器
		// 調(diào)用postProcessBeforeInstantiation方法
		Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
		// 如果后置處理器返回了Bean實(shí)例則直接返回
		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) {
		// 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);
	}
}

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
		throws BeanCreationException {

	// Instantiate the bean.
	BeanWrapper instanceWrapper = null;
	if (mbd.isSingleton()) {
		instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
	}
	if (instanceWrapper == null) {
		// 創(chuàng)建實(shí)例,使用BeanWrapper包裝
		// 構(gòu)造方法的@Autowired也在這里面實(shí)現(xiàn)
		instanceWrapper = createBeanInstance(beanName, mbd, args);
	}
	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 {
				// 調(diào)用MergedBeanDefinitionPostProcessor處理器
				applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
			} catch (Throwable ex) {
				throw new BeanCreationException(mbd.getResourceDescription(), beanName,
						"Post-processing of merged bean definition failed", ex);
			}
			mbd.postProcessed = true;
		}
	}

	// 這里使用三級(jí)緩存封裝了一段代碼,解決循環(huán)依賴問題
	// 這段代碼會(huì)執(zhí)行SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference方法
	// 依賴這個(gè)Bean的其他Bean在填充屬性時(shí),調(diào)用getSingleton時(shí)會(huì)執(zhí)行g(shù)etEarlyBeanReference方法
	// 此時(shí)可以對(duì)這個(gè)Bean實(shí)例做一些事情,比如創(chuàng)建AOP代理
	// 之后會(huì)將修改之后的對(duì)象放入到二級(jí)緩存
	boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
			isSingletonCurrentlyInCreation(beanName));
	if (earlySingletonExposure) {
		addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
	}

	// Initialize the bean instance.
	Object exposedObject = bean;
	try {
		// Populate the bean instance in the given BeanWrapper 
		// with the property values from the bean definition.
		// 1. 調(diào)用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
		// 2. 依賴注入
		populateBean(beanName, mbd, instanceWrapper);
		// Initialize the given bean instance, applying factory 
		// callbacks as well as init methods and bean post processors.
		// 1. invokeAwareMethods
		// 2. 調(diào)用BeanPostProcessor的postProcessBeforeInitialization
		// 3. InitializingBean的afterPropertiesSet和initMethod
		// 4. 調(diào)用BeanPostProcessor的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) {
		// 獲取提前暴露的Bean實(shí)例
		Object earlySingletonReference = getSingleton(beanName, false);
		if (earlySingletonReference != null) {
			if (exposedObject == bean) {
				// 使用提前暴露的Bean替換當(dāng)前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, "");
				}
			}
		}
	}

	// Register bean as disposable.
	try {
		registerDisposableBeanIfNecessary(beanName, bean, mbd);
	} catch (BeanDefinitionValidationException ex) {
		throw new BeanCreationException(
				mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
	}

	return exposedObject;
}

創(chuàng)建Prototype類型的Bean

// It's a prototype -> create a new instance.
Object prototypeInstance = null;
try {
	// 把beanName注冊(cè)到ThreadLocal prototypesCurrentlyInCreation中
	beforePrototypeCreation(beanName);
	// 這里的邏輯與singleton一樣了
	prototypeInstance = createBean(beanName, mbd, args);
} finally {
	// 把beanName從ThreadLocal prototypesCurrentlyInCreation清除
	afterPrototypeCreation(beanName);
}
bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);

到了這里,關(guān)于spring啟動(dòng)流程 (2) Bean實(shí)例化流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Bean的實(shí)例化過程

    Spring Bean的實(shí)例化過程

    一、前言 對(duì)于寫Java的程序員來說,Spring已經(jīng)成為了目前最流行的第三方開源框架之一,在我們充分享受Spring IOC容器帶來的紅利的同時(shí),我們也應(yīng)該考慮一下Spring這個(gè)大工廠是如何將一個(gè)個(gè)的Bean生產(chǎn)出來的,本期我們就一起來討論一下Spring中Bean的實(shí)例化過程。 1.1 Spring Bean

    2024年02月10日
    瀏覽(15)
  • spring實(shí)例化bean之循環(huán)依賴

    spring實(shí)例化bean之循環(huán)依賴

    serviceA里注入了serviceB,serviceB里又注入了serviceA,這樣在實(shí)例化serviceA時(shí),在doCreateBean時(shí)的populateBean時(shí)會(huì)先實(shí)例化serviceB,然后實(shí)例化serviceB,在serviceB的doCreateBean方法的populateBean又會(huì)去找servcieA,這樣循環(huán)依賴就產(chǎn)生了。 解決辦法就是在populateBean之前把當(dāng)前的serviceA提前暴露,然

    2024年02月08日
    瀏覽(16)
  • spring中bean實(shí)例化的三種方式 -- Spring入門(二)

    spring中bean實(shí)例化的三種方式 -- Spring入門(二)

    為了鞏固所學(xué)的知識(shí),作者嘗試著開始發(fā)布一些學(xué)習(xí)筆記類的博客,方便日后回顧。當(dāng)然,如果能幫到一些萌新進(jìn)行新技術(shù)的學(xué)習(xí)那也是極好的。作者菜菜一枚,文章中如果有記錄錯(cuò)誤,歡迎讀者朋友們批評(píng)指正。 (博客的參考源碼以及可以在我主頁(yè)的資源里找到,如果在學(xué)

    2024年02月16日
    瀏覽(21)
  • Spring中Bean加載流程

    Spring中Bean加載流程

    BeanDefinition 1.1什么是BeanDefinition? 1.2 BeanDifinition中重要的屬性 1.3 BeanDefinition的解析 BeanFactory 2.1 什么是BeanFactory? 2.2 BeanFactory工作流程: Bean生命周期 3.1 什么是Bean生命周期? Bean生命周期是Spring中一個(gè)Bean創(chuàng)建過程和銷毀過程中所經(jīng)歷的步驟,其中Bean創(chuàng)建過程是重點(diǎn)。 3.2 核

    2024年02月09日
    瀏覽(19)
  • 【Spring】使用@Bean和@Import注解配置Bean,與Bean的實(shí)例化

    【Spring】使用@Bean和@Import注解配置Bean,與Bean的實(shí)例化

    目錄 1、bean是什么 2、配置bean 2.1、使用@Bean注解配置Bean 2.2、使用@Import注解配置Bean ?3、實(shí)例化Bean ????????在 Spring 中,Bean 是指由 Spring 容器管理的對(duì)象。Spring IOC 容器負(fù)責(zé)創(chuàng)建、配置和管理這些 Bean 對(duì)象的生命周期。Spring IOC 容器會(huì)管理應(yīng)用程序中的組件,并通過依賴注

    2024年04月15日
    瀏覽(26)
  • 【Spring(四)】萬(wàn)字詳解bean的實(shí)例化

    【Spring(四)】萬(wàn)字詳解bean的實(shí)例化

    ??在上篇文章,我們已經(jīng)完成了 入門案例 的學(xué)習(xí),在入門案例中,我們講了三塊東西,首先是 bean怎么定義配置,DI怎么去制作配置以及我們的容器對(duì)象如何去獲取 在接下來的內(nèi)容中,我們將針對(duì)以上三塊東西展開學(xué)習(xí)????。 在學(xué)習(xí)bean的實(shí)例化之前,我們先來學(xué)習(xí) b

    2024年02月21日
    瀏覽(17)
  • 【Spring專題】Spring之Bean的生命周期源碼解析——階段二(IOC之實(shí)例化)

    【Spring專題】Spring之Bean的生命周期源碼解析——階段二(IOC之實(shí)例化)

    由于Spring源碼分析是一個(gè)前后聯(lián)系比較強(qiáng)的過程,而且這邊分析,也是按照代碼順序講解的,所以不了解前置知識(shí)的情況下,大概率沒辦法看懂當(dāng)前的內(nèi)容。所以,特別推薦看看我前面的文章(自上而下次序): Spring底層核心原理解析——引導(dǎo)篇【學(xué)習(xí)難度: ★★☆☆☆ 】

    2024年02月13日
    瀏覽(38)
  • 【Spring篇】講解Bean的三種配置和實(shí)例化方法

    【Spring篇】講解Bean的三種配置和實(shí)例化方法

    ??專欄【Spring】 ??喜歡的詩(shī)句:天行健,君子以自強(qiáng)不息。 ??音樂分享【如愿】 ??歡迎并且感謝大家指出小吉的問題?? 在Spring框架中,Bean的配置和實(shí)例化是很重要的基礎(chǔ)內(nèi)容。掌握各種配置方式,才能靈活管理Bean對(duì)象。本文將全面介紹Bean的別名配置、作用范圍配置,以及

    2024年02月08日
    瀏覽(20)
  • 【Spring】Bean的作用域與生命周期詳情:請(qǐng)簡(jiǎn)述Spring的執(zhí)行流程并分析Bean的生命周期?

    【Spring】Bean的作用域與生命周期詳情:請(qǐng)簡(jiǎn)述Spring的執(zhí)行流程并分析Bean的生命周期?

    ?我們都知道,Spring框架為開發(fā)人員提供了很多便捷,這使得開發(fā)人員能夠更加專注于應(yīng)用程序的核心業(yè)務(wù)邏輯,而不需要花費(fèi)大量時(shí)間和精力在技術(shù)細(xì)節(jié)上。作為一個(gè)包含眾多工具方法的IoC容器,存取JavaBean是其極為重要的一個(gè)環(huán)節(jié)。本文就對(duì)Spring中的Bean的作用域和生命周

    2024年02月12日
    瀏覽(27)
  • 【Spring專題】Bean的生命周期流程圖

    【Spring專題】Bean的生命周期流程圖

    我向來不主張【通過源碼】理解業(yè)務(wù),因?yàn)槊總€(gè)人的能力有限,甚至可能會(huì)因?yàn)殚喿x錯(cuò)誤導(dǎo)致出現(xiàn)理解上的偏差,所以我決定,還是先幫大家【開天眼】,先整體看看流程圖,好知道,Spring在寫源碼的過程中到底干了啥事情。 對(duì)于【一、之前推測(cè)的簡(jiǎn)單流程圖】大家可以不看

    2024年02月13日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包