日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring bean的生命周期和创建流程

發(fā)布時(shí)間:2025/3/19 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring bean的生命周期和创建流程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、從composeScan注解中掃描到新類或者@BEAN中得到新類,并將beanDefinner注冊(cè)到容器工廠中。

二、在refreshContext中會(huì)創(chuàng)建實(shí)例。AbstractAutowireCapableBeanFactory.doCreateBean方法中。

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) {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 {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.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");}addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.Object exposedObject = bean;try {populateBean(beanName, mbd, instanceWrapper);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 [" );}}}}// Register bean as disposable.try {registerDisposableBeanIfNecessary(beanName, bean, mbd);}catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject;}

? ? ? ?1.創(chuàng)建實(shí)例對(duì)象 。instanceWrapper = createBeanInstance(beanName, mbd, args);,實(shí)際上是通過反射創(chuàng)建實(shí)例對(duì)象,這里的對(duì)象,接口是java動(dòng)態(tài)代理,類是cglib動(dòng)態(tài)代理。

? ? ? ?2.調(diào)用容器中所有實(shí)現(xiàn)了MergedBeanDefinitionPostProcessor的接口,進(jìn)行BEAN的字段屬性合并。在這里主要是作了@resource,@autowired的屬性合并到beandefinner對(duì)象 。

protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof MergedBeanDefinitionPostProcessor) {MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);}}}

? ? ? ?3.將beandefinner對(duì)象的屬性數(shù)據(jù)填充到實(shí)例對(duì)象的屬性字段 調(diào)用populateBean(beanName, mbd, instanceWrapper);實(shí)際上是通過反射調(diào)用屬性字段的修改。

? ? ? 4.調(diào)用initializeBean進(jìn)行填充屬性后的初始化操作。

? ? ? ?4.1 首先會(huì)調(diào)用AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization,對(duì)容器中所有實(shí)現(xiàn)了BeanPostProcessor接口進(jìn)行before回調(diào),

public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}

? ? 4.2 如果此對(duì)象實(shí)現(xiàn)了InitializingBean,則會(huì)調(diào)用afterPropertiesSet方法。

? ? 4.3 如果此對(duì)象自定義了初始化方法,也會(huì)觸發(fā)。

? ?4.4調(diào)用AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization

,對(duì)容器中所有實(shí)現(xiàn)了BeanPostProcessor接口進(jìn)行after回調(diào),

總結(jié)

以上是生活随笔為你收集整理的spring bean的生命周期和创建流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。