最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring循環(huán)引用失敗問(wèn)題源碼解析

 更新時(shí)間:2022年09月05日 09:27:50   作者:石臻臻的雜貨鋪  
這篇文章主要為大家介紹了Spring循環(huán)引用失敗問(wèn)題源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言:

之前我們有分析過(guò)Spring是怎么解決循環(huán)引用的問(wèn)題,主要思路就是三級(jí)緩存;

Spring在加載beanA的時(shí)候會(huì)先調(diào)用默認(rèn)的空構(gòu)造函數(shù)(在沒(méi)有指定構(gòu)造函數(shù)實(shí)例化的前提下)得到一個(gè)空的實(shí)例引用對(duì)象,這個(gè)時(shí)候沒(méi)有設(shè)置任何值,但是Spring會(huì)用緩存把它給提前暴露出來(lái),讓其他依賴beanA的bean可以持有它提前暴露的引用;

比如 a 依賴b ,b依賴a,并且他們都是通過(guò)默認(rèn)方法實(shí)例化,那么簡(jiǎn)單流程是這樣的:

  • ioc實(shí)例化a,a提前暴露自己的,然后填充屬性值,在填充屬性值的時(shí)候發(fā)現(xiàn)有個(gè)對(duì)象b,這個(gè)時(shí)候去容器里面取到b的引用,發(fā)現(xiàn)b還沒(méi)有被創(chuàng)建,那么就走實(shí)例化b的流程;
  • 實(shí)例化b;流程跟a一樣;但是不同的是b填充屬性的時(shí)候,發(fā)現(xiàn)有引用a的實(shí)例,這個(gè)時(shí)候a已經(jīng)提前暴露了自己了,所以b可以直接在容器里面拿到a的引用;那么b就實(shí)例化并且也初始化完成了;
  • 拿到b了之后,a就可以持有b的引用 ,整個(gè)流程就走完了;

具體詳細(xì)一點(diǎn)可以看這篇文章Spring-bean的循環(huán)依賴以及解決方式

Spring不能解決“A的構(gòu)造方法中依賴了B的實(shí)例對(duì)象,同時(shí)B依賴了A的實(shí)例對(duì)象”這類問(wèn)題

這篇文章我想從源碼的角度來(lái)分析一下整個(gè)流程;

并且分析一下Spring為什么不能解決“A的構(gòu)造方法中依賴了B的實(shí)例對(duì)象,同時(shí)B依賴了A的實(shí)例對(duì)象”這類問(wèn)題

例子

首先創(chuàng)建兩個(gè)bean類; CirculationA 有個(gè)屬性circulationB,并且有個(gè)構(gòu)造函數(shù)給circulationB賦值;

public class CirculationA {
    private CirculationB circulationB;
    public CirculationA(CirculationB circulationB) {
        this.circulationB = circulationB;
    }
}

CirculationB 有個(gè)屬性circulationA,然后set方法

public class CirculationB {
    private CirculationA circulationA;
    public CirculationA getCirculationA() {
        return circulationA;
    }
    public void setCirculationA(CirculationA circulationA) {
        this.circulationA = circulationA;
    }
}

SpringContextConfig.xml circulationa 用給定的構(gòu)造函數(shù)實(shí)例化;

circulationb 就用默認(rèn)的實(shí)例化方法(默認(rèn)的空構(gòu)造函數(shù))

  <bean id="circulationa" class="src.bean.CirculationA">
    <constructor-arg name="circulationB" ref="circulationb"/>
  </bean>
  <bean id="circulationb" class="src.bean.CirculationB" >
    <property name="circulationA" ref="circulationa"/>
  </bean>

好,例子準(zhǔn)完畢,上面的例子是 circulationa的構(gòu)造函數(shù)里面有circulationb;

然后circulationb屬性里面有circulationa;

啟動(dòng)容器

結(jié)果如下:

警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'circulationa' defined in class path resource [config.xml]: Cannot resolve reference to bean 'circulationb' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'circulationb' defined in class path resource [config.xml]: Cannot resolve reference to bean 'circulationa' while setting bean property 'circulationA'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'circulationa': Requested bean is currently in creation: Is there an unresolvable circular reference?
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'circulationa' defined in class path resource [config.xml]: Cannot resolve reference to bean 'circulationb' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'circulationb' defined in class path resource [config.xml]: Cannot resolve reference to bean 'circulationa' while setting bean property 'circulationA'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'circulationa': Requested bean is currently in creation: Is there an unresolvable circular reference?
Disconnected from the target VM, address: '127.0.0.1:64128', transport: 'socket'
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:648)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:145)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at StartIOCUseDefaultListAbleBeanFactory.main(StartIOCUseDefaultListAbleBeanFactory.java:30)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'circulationb' defined in class path resource [config.xml]: Cannot resolve reference to bean 'circulationa' while setting bean property 'circulationA'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'circulationa': Requested bean is currently in creation: Is there an unresolvable circular reference?
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1531)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1276)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    ... 17 more
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'circulationa': Requested bean is currently in creation: Is there an unresolvable circular reference?
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:347)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    ... 27 more
 

報(bào)錯(cuò)了,Spring它解決不了這種情況 Ok,源碼走起來(lái): 為了節(jié)省篇幅我只貼重要代碼 第一步

加載circulationa AbstractBeanFactory

public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
	protected <T> T doGetBean(
			final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
			throws BeansException {
				if (mbd.isSingleton()) {
					sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
						@Override
						public Object getObject() throws BeansException {
							try {
								return createBean(beanName, mbd, args);
							}
						}
					});
				}
	}
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
		//在創(chuàng)建之前把beanName加入到正在創(chuàng)建中的屬性中singletonsCurrentlyInCreation;
		//但是這個(gè)是一個(gè)set,如果之前已經(jīng)加進(jìn)去了,再進(jìn)去就拋異常BeanCurrentlyInCreationException
		//Requested bean is currently in creation: Is there an unresolvable circular reference?")提示可能存在循環(huán)引用
		beforeSingletonCreation(beanName);
	}
	protected void beforeSingletonCreation(String beanName) {
		if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.add(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}
	}
	@Override
	protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
	Object beanInstance = doCreateBean(beanName, mbdToUse, args);
	}
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
			throws BeanCreationException {
			instanceWrapper = createBeanInstance(beanName, mbd, args);
//.......
// Initialize the bean instance.
		Object exposedObject = bean;
		try {
			populateBean(beanName, mbd, instanceWrapper);
			if (exposedObject != null) {
				exposedObject = initializeBean(beanName, exposedObject, mbd);
			}
		}
}
	protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
	Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
	//因?yàn)閏irculationa是有構(gòu)造函數(shù)的,所以使用autowireConstructor
		if (ctors != null ||
				mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
				mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {
			return autowireConstructor(beanName, mbd, ctors, args);
		}
	}
//最終執(zhí)行
public BeanWrapper autowireConstructor(final String beanName, final RootBeanDefinition mbd,
			Constructor<?>[] chosenCtors, final Object[] explicitArgs) {
			//解析構(gòu)造函數(shù)參數(shù)值
				minNrOfArgs = resolveConstructorArguments(beanName, mbd, bw, cargs, resolvedValues);
				//......
//選擇對(duì)應(yīng)的策略來(lái)實(shí)例化對(duì)象;這里是生成正在的實(shí)例了。
//但是在這之前,構(gòu)造參數(shù)要拿到
				beanInstance = this.beanFactory.getInstantiationStrategy().instantiate(
						mbd, beanName, this.beanFactory, constructorToUse, argsToUse);
}
}

省略....

最終調(diào)用BeanDefinitionValueResolver

/**
	 * Resolve a reference to another bean in the factory.
	 */
	private Object resolveReference(Object argName, RuntimeBeanReference ref) {
		try {
			String refName = ref.getBeanName();
			refName = String.valueOf(doEvaluate(refName));
			if (ref.isToParent()) {
				if (this.beanFactory.getParentBeanFactory() == null) {
					throw new BeanCreationException(
							this.beanDefinition.getResourceDescription(), this.beanName,
							"Can't resolve reference to bean '" + refName +
							"' in parent factory: no parent factory available");
				}
				//!!!這里,要先去查找refName的實(shí)例
				return this.beanFactory.getParentBeanFactory().getBean(refName);
			}
			else {
				Object bean = this.beanFactory.getBean(refName);
				this.beanFactory.registerDependentBean(refName, this.beanName);
				return bean;
			}
		}
		catch (BeansException ex) {
			throw new BeanCreationException(
					this.beanDefinition.getResourceDescription(), this.beanName,
					"Cannot resolve reference to bean '" + ref.getBeanName() + "' while setting " + argName, ex);
		}
	}

跟著上面的順序我們整理一下;

  • 啟動(dòng)容器,加載circulationa,因?yàn)槭菢?gòu)造函數(shù)生成,所以要先解析構(gòu)造函數(shù)的屬性,這時(shí)候發(fā)現(xiàn)有引用circulationb,那么通過(guò)getBean(circulationb)先拿到circulationb的實(shí)例;
  • 如果拿到了,則生成circulationa的實(shí)例對(duì)象返回;但是這個(gè)時(shí)候代碼執(zhí)行circulationb的加載過(guò)程了;

circulationb加載分析

然后我們分析一下circulationb加載 circulationb跟circulationa差不多 加載circulationb,把它加入到正在創(chuàng)建的屬性中

protected void beforeSingletonCreation(String beanName) {
		if (!this.inCreationCheckExclusions.contains(beanName) &amp;&amp; !this.singletonsCurrentlyInCreation.add(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}
	}

然后用默認(rèn)的方式創(chuàng)建實(shí)例; circulationa 是rautowireConstructor(beanName, mbd, ctors, args)創(chuàng)建的;這個(gè)方法需要先拿到構(gòu)造函數(shù)的值;所以執(zhí)行了調(diào)用getBean(circulationb)

circulationa是調(diào)用了instantiateBean;這個(gè)方法不需要提前知道屬性;它用默認(rèn)的構(gòu)造函數(shù)生成實(shí)例;這時(shí)候的實(shí)例是沒(méi)有設(shè)置任何屬性的;

protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
				beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
	}

不過(guò)生成了實(shí)例之后,在doCreateBean方法中有一個(gè)populateBean;這個(gè)方法就是專門(mén)填充屬性值的,因?yàn)閏irculationb有circulationa的屬性; 所以會(huì)去容器里面取circulationa的引用;

但是circulationa這個(gè)時(shí)候還沒(méi)有成功創(chuàng)建實(shí)例??;因?yàn)樗€一直在等circulationb創(chuàng)建成功之后返回給它引用呢,返回了circulationa才能創(chuàng)建實(shí)例啊;

這個(gè)時(shí)候circulationb沒(méi)有拿到circulationa,那么又會(huì)去調(diào)用getBean(circulationa); 大家想一想如果這樣下去就沒(méi)完沒(méi)了了啊; 所以Spring就拋出異常了 那么在哪里拋出異常呢? 在第二次調(diào)用getBean(circulationa)的時(shí)候會(huì)走到下面

		if (!this.inCreationCheckExclusions.contains(beanName) &amp;&amp; !this.singletonsCurrentlyInCreation.add(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}
	}

因?yàn)閏irculationa之前加進(jìn)來(lái)過(guò)一次啊,而且沒(méi)有創(chuàng)建成功是不會(huì)刪除的??;

現(xiàn)在又add一次,因?yàn)閠his.singletonsCurrentlyInCreation是一個(gè)set;

已經(jīng)存在的再次add會(huì)返回false;那么這段代碼就會(huì)拋出異常了;

Error creating bean with name 'circulationa': Requested bean is currently in creation: Is there an unresolvable circular reference?

情況就是這樣,只要是用構(gòu)造函數(shù)創(chuàng)建一個(gè)實(shí)例,并且構(gòu)造函數(shù)里包含的值存在循環(huán)引用,那么spring就會(huì)拋出異常;

所以如果有循環(huán)引用的情況請(qǐng)避免使用構(gòu)造函數(shù)的方式

以上就是Spring循環(huán)引用失敗問(wèn)題源碼解析的詳細(xì)內(nèi)容,更多關(guān)于Spring循環(huán)引用失敗的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • idea 如何查找類中的某個(gè)方法

    idea 如何查找類中的某個(gè)方法

    這篇文章主要介紹了idea 如何查找類中的某個(gè)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java創(chuàng)建線程的七種方法總結(jié)(全網(wǎng)最全面)

    Java創(chuàng)建線程的七種方法總結(jié)(全網(wǎng)最全面)

    線程是Java中的基本執(zhí)行單元,它允許程序在同一時(shí)間執(zhí)行多個(gè)任務(wù),下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java創(chuàng)建線程的七種方法,文中通過(guò)實(shí)例代碼將這七種方法介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • SpringMVC源碼解讀之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化

    SpringMVC源碼解讀之 HandlerMapping - AbstractDetectingUrlHandlerM

    這篇文章主要介紹了SpringMVC源碼解讀之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 詳解Java中使用泛型實(shí)現(xiàn)快速排序算法的方法

    詳解Java中使用泛型實(shí)現(xiàn)快速排序算法的方法

    這篇文章主要介紹了Java中使用泛型實(shí)現(xiàn)快速排序算法的方法,快速排序的平均時(shí)間復(fù)雜度為(n\log n),文中的方法立足于基礎(chǔ)而并沒(méi)有考慮優(yōu)化處理,需要的朋友可以參考下
    2016-05-05
  • Mybatis核心配置文件、默認(rèn)類型別名、Mybatis獲取參數(shù)值的兩種方式(實(shí)例代碼)

    Mybatis核心配置文件、默認(rèn)類型別名、Mybatis獲取參數(shù)值的兩種方式(實(shí)例代碼)

    這篇文章主要介紹了Mybatis核心配置文件、默認(rèn)類型別名、Mybatis獲取參數(shù)值的兩種方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-03-03
  • springboot導(dǎo)出excel多個(gè)sheet導(dǎo)出的實(shí)現(xiàn)

    springboot導(dǎo)出excel多個(gè)sheet導(dǎo)出的實(shí)現(xiàn)

    在Java開(kāi)發(fā)過(guò)程中,合理配置pom.xml文件對(duì)項(xiàng)目的管理和構(gòu)建至關(guān)重要,通過(guò)添加依賴管理項(xiàng)目所需的庫(kù),簡(jiǎn)化了項(xiàng)目構(gòu)建過(guò)程,同時(shí),掌握導(dǎo)出excel工具類的使用,可以有效地處理數(shù)據(jù)導(dǎo)出需求,提高工作效率,本文結(jié)合個(gè)人經(jīng)驗(yàn)
    2024-10-10
  • Java實(shí)現(xiàn)冒泡排序

    Java實(shí)現(xiàn)冒泡排序

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)冒泡排序,把一列數(shù)組按從小到大或從大到小排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • IDEA報(bào)錯(cuò):java?找不到符號(hào)圖文解決過(guò)程

    IDEA報(bào)錯(cuò):java?找不到符號(hào)圖文解決過(guò)程

    這篇文章主要給大家介紹了關(guān)于IDEA報(bào)錯(cuò):java?找不到符號(hào)解決的相關(guān)資料,運(yùn)行項(xiàng)目時(shí)Idea報(bào)錯(cuò),提示找不到符號(hào),但是這個(gè)類在項(xiàng)目里是存在的,網(wǎng)上找了很多文章都沒(méi)解決,浪費(fèi)了一個(gè)下午終于弄好了,記錄一下,需要的朋友可以參考下
    2023-08-08
  • Java Web之限制用戶多處登錄實(shí)例代碼

    Java Web之限制用戶多處登錄實(shí)例代碼

    本篇文章主要介紹了Java Web之限制用戶多處登錄實(shí)例代碼,可以限制單個(gè)用戶在多個(gè)終端登錄。非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-03-03
  • Java?輸入輸出?IO?NIO?AIO三兄弟對(duì)比分析對(duì)比分析

    Java?輸入輸出?IO?NIO?AIO三兄弟對(duì)比分析對(duì)比分析

    這篇文章主要為大家介紹了Java?輸入輸出?IO?NIO?AIO三兄弟對(duì)比分析對(duì)比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論

门源| 凭祥市| 禄劝| 海兴县| 密山市| 应城市| 崇义县| 民和| 柞水县| 民和| 东莞市| 顺昌县| 民县| 汕尾市| 宜宾县| 彭州市| 永善县| 长岛县| 尼木县| 赤城县| 荥阳市| 和田县| 呼和浩特市| 汶上县| 开远市| 镇康县| 区。| 金门县| 长泰县| 虎林市| 朔州市| 娱乐| 噶尔县| 驻马店市| 从化市| 南川市| 隆回县| 乌兰浩特市| 浦东新区| 鹿泉市| 申扎县|