国产午夜男女在线|欧美日本一道高清国产|亚洲日韩乱码中文字幕|麻豆国产97在线精品一区|日韩一区2区三区另类图片|亚洲精品国产99在线观看|亚洲国产午夜福利精品大秀在线|一级做a爰片性色毛片免费网站

          1. <form id="n2a4a"><nav id="n2a4a"></nav></form>
          2. 您當(dāng)前的位置 :寧夏資訊網(wǎng) > 資訊 >  內(nèi)容正文
            投稿

            Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析!

            寧夏資訊網(wǎng) 2020-11-20 04:36:16 來源: 閱讀:-

            優(yōu)質(zhì)文章,及時(shí)送達(dá)

            Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

            編輯 | Java之間(gengecn)

            來源 | tech.souyunku.com/?p=13107

            在網(wǎng)上已經(jīng)有跟多Bean的生命周期的博客,但是很多都是基于比較老的版本了,最近吧整個(gè)流程化成了一個(gè)流程圖。待會(huì)兒使用流程圖,說明以及代碼的形式來說明整個(gè)聲明周期的流程。注意因?yàn)榇a比較多,這里的流程圖只畫出了大概的流程,具體的可以深入代碼

            一、獲取Bea

            Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

            第一階段獲取Bean

            這里的流程圖的入口在 AbstractBeanFactory類的doGetBean方法,這里可以配合前面的 getBean方法分析文章進(jìn)行閱讀。主要流程就是

            1、先處理Bean 的名稱,因?yàn)槿绻浴?”開頭的Bean名稱表示獲取的是對(duì)應(yīng)的FactoryBean對(duì)象;

            2、從緩存中獲取單例Bean,有則進(jìn)一步判斷這個(gè)Bean是不是在創(chuàng)建中,如果是的就等待創(chuàng)建完畢,否則直接返回這個(gè)Bean對(duì)象

            3、如果不存在單例Bean緩存,則先進(jìn)行循環(huán)依賴的解析

            4、解析完畢之后先獲取父類BeanFactory,獲取到了則調(diào)用父類的getBean方法,不存在則先合并然后創(chuàng)建Bean

            二、創(chuàng)建Bean

            2.1 創(chuàng)建Bean之前

            Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

            在真正創(chuàng)建Bean之前邏輯

            這個(gè)流程圖對(duì)應(yīng)的代碼在 AbstractAutowireCapableBeanFactory類的createBean方法中。

            1、這里會(huì)先獲取RootBeanDefinition對(duì)象中的Class對(duì)象并確保已經(jīng)關(guān)聯(lián)了要?jiǎng)?chuàng)建的Bean的Class 。整編:微信公眾號(hào),搜云庫技術(shù)團(tuán)隊(duì),ID:souyunku

            2、這里會(huì)檢查3個(gè)條件

            (1)Bean的屬性中的 beforeInstantiationResolved字段是否為true,默認(rèn)是false。

            (2)Bean是原生的Bean

            (3)Bean的 hasInstantiationAwareBeanPostProcessors屬性為true,這個(gè)屬性在Spring準(zhǔn)備刷新容器錢轉(zhuǎn)杯BeanPostProcessors的時(shí)候會(huì)設(shè)置,如果當(dāng)前Bean實(shí)現(xiàn)了InstantiationAwareBeanPostProcessor則這個(gè)就會(huì)是true。

            當(dāng)三個(gè)條件都存在的時(shí)候,就會(huì)調(diào)用實(shí)現(xiàn)的 InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法,然后獲取返回的Bean,如果返回的Bean不是還會(huì)調(diào)用實(shí)現(xiàn)的BeanPostProcessor接口的postProcessAfterInitialization方法,這里用代碼說明

            1. protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {

            2. Object bean = ;

            3. //條件1

            4. if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {

            5. //條件2跟條件3

            6. if (!mbd.isSynthetic && hasInstantiationAwareBeanPostProcessors) {

            7. Class targetType = determineTargetType(beanName, mbd);

            8. if (targetType != ) {

            9. //調(diào)用實(shí)現(xiàn)的postProcessBeforeInstantiation方法

            10. bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);

            11. if (bean != ) {

            12. //調(diào)用實(shí)現(xiàn)的postProcessAfterInitialization方法

            13. bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);

            14. }

            15. }

            16. }

            17. //不滿足2或者3的時(shí)候就會(huì)設(shè)置為false

            18. mbd.beforeInstantiationResolved = (bean != );

            19. }

            20. return bean;

            21. }

            1、如果上面3個(gè)條件其中一個(gè)不滿足就不會(huì)調(diào)用實(shí)現(xiàn)的方法。默認(rèn)這里都不會(huì)調(diào)用的這些BeanPostProcessors的實(shí)現(xiàn)方法。然后繼續(xù)執(zhí)行后面的doCreateBean方法。

            2.1 真正的創(chuàng)建Bean,doCreateBean

            Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

            doCreateBean方法邏輯

            這個(gè)代碼的實(shí)現(xiàn)還是在 AbstractAutowireCapableBeanFactory方法中。流程是

            1、先檢查instanceWrapper變量是不是,這里一般是,除非當(dāng)前正在創(chuàng)建的Bean在factoryBeanInstanceCache中存在這個(gè)是保存還沒創(chuàng)建完成的FactoryBean的集合。

            2、調(diào)用createBeanInstance方法實(shí)例化Bean,這個(gè)方法在后面會(huì)講解

            3、如果當(dāng)前RootBeanDefinition對(duì)象還沒有調(diào)用過實(shí)現(xiàn)了的MergedBeanDefinitionPostProcessor接口的方法,則會(huì)進(jìn)行調(diào)用 。整編:微信公眾號(hào),搜云庫技術(shù)團(tuán)隊(duì),ID:souyunku

            4、 當(dāng)滿足以下三點(diǎn)

            (1)是單例Bean

            (2)嘗試解析bean之間的循環(huán)引用

            (3)bean目前正在創(chuàng)建中

            則會(huì)進(jìn)一步檢查是否實(shí)現(xiàn)了 SmartInstantiationAwareBeanPostProcessor接口如果實(shí)現(xiàn)了則調(diào)用是實(shí)現(xiàn)的getEarlyBeanReference方法 5、 調(diào)用populateBean方法進(jìn)行屬性填充,這里后面會(huì)講解 6、 調(diào)用initializeBean方法對(duì)Bean進(jìn)行初始化,這里后面會(huì)講解

            2.1.1 實(shí)例化Bean,createBeanInstance

            Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

            實(shí)例化Bean

            這里的邏輯稍微有一點(diǎn)復(fù)雜,這個(gè)流程圖已經(jīng)是簡(jiǎn)化過后的了。簡(jiǎn)要根據(jù)代碼說明一下流程

            1. protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @ableObject[] args) {

            2. //步驟1

            3. Class beanClass = resolveBeanClass(mbd, beanName);


            4. if (beanClass != && !Modifier.isPublic(beanClass.getModifiers) && !mbd.isNonPublicAccessAllowed) {

            5. throw new BeanCreationException(mbd.getResourceDescription, beanName,

            6. "Bean class isn't public, and non-public access not allowed: "+ beanClass.getName);

            7. }

            8. //步驟2

            9. Supplier instanceSupplier = mbd.getInstanceSupplier;

            10. if (instanceSupplier != ) {

            11. return obtainFromSupplier(instanceSupplier, beanName);

            12. }

            13. //步驟3

            14. if (mbd.getFactoryMethodName != ) {

            15. return instantiateUsingFactoryMethod(beanName, mbd, args);

            16. }



            17. boolean resolved = false;

            18. boolean autowireNecessary = false;

            19. if (args == ) {

            20. synchronized (mbd.constructorArgumentLock) {

            21. if (mbd.resolvedConstructorOrFactoryMethod != ) {

            22. resolved = true;

            23. autowireNecessary = mbd.constructorArgumentsResolved;

            24. }

            25. }

            26. }

            27. //步驟4.1

            28. if (resolved) {


            29. if (autowireNecessary) {

            30. return autowireConstructor(beanName, mbd, , );

            31. }

            32. else {


            33. return instantiateBean(beanName, mbd);

            34. }

            35. }


            36. //步驟4.2

            37. Constructor ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);

            38. if (ctors != || mbd.getResolvedAutowireMode == AUTOWIRE_CONSTRUCTOR ||

            39. mbd.hasConstructorArgumentValues || !ObjectUtils.isEmpty(args)) {

            40. return autowireConstructor(beanName, mbd, ctors, args);

            41. }


            42. //步驟5

            43. ctors = mbd.getPreferredConstructors;

            44. if (ctors != ) {

            45. return autowireConstructor(beanName, mbd, ctors, );

            46. }



            47. return instantiateBean(beanName, mbd);

            48. }

            1、先檢查Class是否已經(jīng)關(guān)聯(lián)了,并且對(duì)應(yīng)的修飾符是否是public的

            2、如果用戶定義了Bean實(shí)例化的函數(shù),則調(diào)用并返回

            3、如果當(dāng)前Bean實(shí)現(xiàn)了FactoryBean接口則調(diào)用對(duì)應(yīng)的FactoryBean接口的getObject方法

            4、根據(jù)getBean時(shí)候是否傳入構(gòu)造參數(shù)進(jìn)行處理

            4.1如果沒有傳入構(gòu)造參數(shù),則檢查是否存在已經(jīng)緩存的無參構(gòu)造器,有則使用構(gòu)造器直接創(chuàng)建,沒有就會(huì)調(diào)用instantiateBean方法先獲取實(shí)例化的策略默認(rèn)是CglibSubclassingInstantiationStrategy,然后實(shí)例化Bean。最后返回

            4.2如果傳入了構(gòu)造參數(shù),則會(huì)先檢查是否實(shí)現(xiàn)了SmartInstantiationAwareBeanPostProcessor接口,如果實(shí)現(xiàn)了會(huì)調(diào)用determineCandidateConstructors獲取返回的候選構(gòu)造器。整編:微信公眾號(hào),搜云庫技術(shù)團(tuán)隊(duì),ID:souyunku

            4.3檢查4個(gè)條件是否滿足一個(gè)

            (1)構(gòu)造器不為,

            (2)從RootBeanDefinition中獲取到的關(guān)聯(lián)的注入方式是構(gòu)造器注入(沒有構(gòu)造參數(shù)就是setter注入,有則是構(gòu)造器注入)

            (3)含有構(gòu)造參數(shù)

            (4)getBean方法傳入構(gòu)造參數(shù)不是空

            滿足其中一個(gè)則會(huì)調(diào)用返回的候選構(gòu)造器實(shí)例化Bean并返回,如果都不滿足,則會(huì)根據(jù)構(gòu)造參數(shù)選則合適的有參構(gòu)造器然后實(shí)例化Bean并返回

            5、如果上面都沒有合適的構(gòu)造器,則直接使用無參構(gòu)造器創(chuàng)建并返回Bean。

            2.1.2 填充Bean,populateBean

            Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

            填充Bean

            這里還是根據(jù)代碼來說一下流程

            1. protected void populateBean(String beanName, RootBeanDefinition mbd, @ableBeanWrapper bw) {

            2. if (bw == ) {

            3. if (mbd.hasPropertyValues) {

            4. throw new BeanCreationException(

            5. mbd.getResourceDescription, beanName, "Cannot apply property values to instance");

            6. }

            7. else {

            8. // Skip property population phase for instance.

            9. return;

            10. }

            11. }



            12. boolean continueWithPropertyPopulation = true;

            13. //步驟1

            14. if (!mbd.isSynthetic && hasInstantiationAwareBeanPostProcessors) {

            15. for (BeanPostProcessor bp : getBeanPostProcessors) {

            16. if (bp instanceof InstantiationAwareBeanPostProcessor) {

            17. InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;

            18. if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance, beanName)) {

            19. continueWithPropertyPopulation = false;

            20. break;

            21. }

            22. }

            23. }

            24. }


            25. if (!continueWithPropertyPopulation) {

            26. return;

            27. }

            28. //步驟2--------------------

            29. PropertyValues pvs = (mbd.hasPropertyValues ? mbd.getPropertyValues : );


            30. int resolvedAutowireMode = mbd.getResolvedAutowireMode;

            31. if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {

            32. MutablePropertyValues newPvs = new MutablePropertyValues(pvs);

            33. // Add property values based on autowire by name if applicable.

            34. if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {

            35. autowireByName(beanName, mbd, bw, newPvs);

            36. }

            37. // Add property values based on autowire by type if applicable.

            38. if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {

            39. autowireByType(beanName, mbd, bw, newPvs);

            40. }

            41. pvs = newPvs;

            42. }


            43. boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors;

            44. boolean needsDepCheck = (mbd.getDependencyCheck != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);


            45. PropertyDescriptor filteredPds = ;

            46. //步驟3

            47. if (hasInstAwareBpps) {

            48. if (pvs == ) {

            49. pvs = mbd.getPropertyValues;

            50. }

            51. for (BeanPostProcessor bp : getBeanPostProcessors) {

            52. if (bp instanceof InstantiationAwareBeanPostProcessor) {

            53. InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;

            54. PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance, beanName);

            55. if (pvsToUse == ) {

            56. if (filteredPds == ) {

            57. filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);

            58. }

            59. pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance, beanName);

            60. if (pvsToUse == ) {

            61. return;

            62. }

            63. }

            64. pvs = pvsToUse;

            65. }

            66. }

            67. }

            68. if (needsDepCheck) {

            69. if (filteredPds == ) {

            70. filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);

            71. }

            72. checkDependencies(beanName, mbd, filteredPds, pvs);

            73. }

            74. //步驟4

            75. if (pvs != ) {

            76. applyPropertyValues(beanName, mbd, bw, pvs);

            77. }

            78. }

            1、檢查當(dāng)前Bean是否實(shí)現(xiàn)了InstantiationAwareBeanPostProcessorpostProcessAfterInstantiation方法則調(diào)用,并結(jié)束Bean的填充。

            2、將按照類型跟按照名稱注入的Bean分開,如果注入的Bean還沒有實(shí)例化的這里會(huì)實(shí)例化,然后放到PropertyValues對(duì)象中。

            3、如果實(shí)現(xiàn)了InstantiationAwareBeanPostProcessor類的postProcessProperties則調(diào)用這個(gè)方法并獲取返回值,如果返回值是,則有可能是實(shí)現(xiàn)了過期的postProcessPropertyValues方法,這里需要進(jìn)一步調(diào)用postProcessPropertyValues方法

            4、進(jìn)行參數(shù)填充

            2.1.3 初始化Bean,initializeBean

            Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

            初始化Bean

            同時(shí)這里根據(jù)代碼跟流程圖來說明

            1、如果Bean實(shí)現(xiàn)了BeanNameAware,BeanClassLoaderAware,BeanFactoryAware則調(diào)用對(duì)應(yīng)實(shí)現(xiàn)的方法 。整編:微信公眾號(hào),搜云庫技術(shù)團(tuán)隊(duì),ID:souyunku

            2、Bean不為并且bean不是合成的,如果實(shí)現(xiàn)了BeanPostProcessorpostProcessBeforeInitialization則會(huì)調(diào)用實(shí)現(xiàn)的postProcessBeforeInitialization方法。在ApplicationContextAwareProcessor類中實(shí)現(xiàn)了postProcessBeforeInitialization方法。而這個(gè)類會(huì)在Spring刷新容器準(zhǔn)備beanFactory的時(shí)候會(huì)加進(jìn)去,這里就會(huì)被調(diào)用,而調(diào)用里面會(huì)檢查Bean是不是EnvironmentAware,EmbeddedValueResolverAware,ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware的實(shí)現(xiàn)類。這里就會(huì)調(diào)用對(duì)應(yīng)的實(shí)現(xiàn)方法。代碼如下

            1. protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {

            2. .......

            3. beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

            4. .......

            1. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

            2. if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||

            3. bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||

            4. bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)){

            5. return bean;

            6. }


            7. AccessControlContext acc = ;


            8. if (System.getSecurityManager != ) {

            9. acc = this.applicationContext.getBeanFactory.getAccessControlContext;

            10. }


            11. if (acc != ) {

            12. AccessController.doPrivileged((PrivilegedAction) -> {

            13. invokeAwareInterfaces(bean);

            14. return ;

            15. }, acc);

            16. }

            17. else {

            18. invokeAwareInterfaces(bean);

            19. }


            20. return bean;

            21. }

            22. 1、實(shí)例化Bean然后,檢查是否實(shí)現(xiàn)了InitializingBeanafterPropertiesSet方法,如果實(shí)現(xiàn)了就會(huì)調(diào)用

              2、Bean不為并且bean不是合成的,如果實(shí)現(xiàn)了BeanPostProcessorpostProcessBeforeInitialization則會(huì)調(diào)用實(shí)現(xiàn)的postProcessAfterInitialization方法。

              到此創(chuàng)建Bean 的流程就沒了,剩下的就是容器銷毀的時(shí)候的了

              三、destory方法跟銷毀Bean

              歡迎關(guān)注公眾號(hào):Java后端

              Bean在創(chuàng)建完畢之后會(huì)檢查用戶是否指定了 destroyMethodName以及是否實(shí)現(xiàn)了DestructionAwareBeanPostProcessor接口的requiresDestruction方法,如果指定了會(huì)記錄下來保存在DisposableBeanAdapter對(duì)象中并保存在bean的disposableBeans屬性中。代碼在AbstractBeanFactoryregisterDisposableBeanIfNecessary

              1. protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) {

              2. ......

              3. registerDisposableBean(beanName,

              4. new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors, acc));

              5. ......

              6. }

              1. public DisposableBeanAdapter(Object bean, String beanName, RootBeanDefinition beanDefinition,

              2. List postProcessors, @ableAccessControlContext acc) {

              3. .......

              4. String destroyMethodName = inferDestroyMethodIfNecessary(bean, beanDefinition);

              5. if (destroyMethodName != && !(this.invokeDisposableBean && "destroy".equals(destroyMethodName)) &&

              6. !beanDefinition.isExternallyManagedDestroyMethod(destroyMethodName)) {

              7. ......

              8. this.destroyMethod = destroyMethod;

              9. }

              10. this.beanPostProcessors = filterPostProcessors(postProcessors, bean);

              11. }

              在銷毀Bean的時(shí)候最后都會(huì)調(diào)用 AbstractAutowireCapableBeanFactorydestroyBean方法。

              1. public void destroyBean(Object existingBean) {

              2. new DisposableBeanAdapter(existingBean, getBeanPostProcessors, getAccessControlContext).destroy;

              3. }

              這里是創(chuàng)建一個(gè) DisposableBeanAdapter對(duì)象,這個(gè)對(duì)象實(shí)現(xiàn)了Runnable接口,在實(shí)現(xiàn)的run方法中會(huì)調(diào)用實(shí)現(xiàn)的DisposableBean接口的destroy方法。并且在創(chuàng)建DisposableBeanAdapter對(duì)象的時(shí)候會(huì)根據(jù)傳入的bean是否實(shí)現(xiàn)了DisposableBean接口來設(shè)置invokeDisposableBean變量,這個(gè)變量表實(shí)有沒有實(shí)現(xiàn)DisposableBean接口

              1. public DisposableBeanAdapter(Object bean, List postProcessors, AccessControlContext acc) {

              2. Assert.not(bean, "Disposable bean must not be ");

              3. this.bean = bean;

              4. this.beanName = bean.getClass.getName;

              5. //根據(jù)傳入的bean是否實(shí)現(xiàn)了`DisposableBean`接口來設(shè)置`invokeDisposableBean`變量

              6. this.invokeDisposableBean = (this.bean instanceof DisposableBean);

              7. this.nonPublicAccessAllowed = true;

              8. this.acc = acc;

              9. this.beanPostProcessors = filterPostProcessors(postProcessors, bean);

              10. }


              11. public void destroy {

              12. ......

              13. //根據(jù)invokeDisposableBean決定是否調(diào)用destroy方法

              14. if (this.invokeDisposableBean) {

              15. if (logger.isTraceEnabled) {

              16. logger.trace("Invoking destroy on bean with name '"+ this.beanName +"'");

              17. }

              18. try {

              19. if (System.getSecurityManager != ) {

              20. AccessController.doPrivileged((PrivilegedExceptionAction) -> {

              21. ((DisposableBean) this.bean).destroy;

              22. return ;

              23. }, this.acc);

              24. }

              25. else {

              26. ((DisposableBean) this.bean).destroy;

              27. }

              28. }

              29. catch (Throwable ex) {

              30. String msg = "Invocation of destroy method failed on bean with name '"+ this.beanName +"'";

              31. if (logger.isDebugEnabled) {

              32. logger.warn(msg, ex);

              33. }

              34. else {

              35. logger.warn(msg + ": "+ ex);

              36. }

              37. }

              38. }

              39. ......

              40. }

              41. 四、總結(jié)。

                最后來一個(gè)大的流程

                Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

                實(shí)例化前的準(zhǔn)備階段

                Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

                實(shí)例化前

                Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

                實(shí)例化后

                Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

                初始化前

                Spring 的 Bean 生命周期,11 張高清流程圖及代碼,深度解析

                -END-

                (正文已結(jié)束)

                推薦閱讀:天津紅橋網(wǎng)

                免責(zé)聲明及提醒:此文內(nèi)容為本網(wǎng)所轉(zhuǎn)載企業(yè)宣傳資訊,該相關(guān)信息僅為宣傳及傳遞更多信息之目的,不代表本網(wǎng)站觀點(diǎn),文章真實(shí)性請(qǐng)瀏覽者慎重核實(shí)!任何投資加盟均有風(fēng)險(xiǎn),提醒廣大民眾投資需謹(jǐn)慎!

                Copyright.2002-2019 寧夏資訊網(wǎng) 版權(quán)所有 本網(wǎng)拒絕一切非法行為 歡迎監(jiān)督舉報(bào) 如有錯(cuò)誤信息 歡迎糾正
                仁寿县| 宜春市| 芮城县| 阿拉尔市| 固阳县| 利川市| 盐源县| 隆化县| 阿合奇县| 横峰县| 珲春市| 安乡县| 宝丰县| 衡水市| 平陆县| 天峨县| 饶河县| 花莲县| 鱼台县| 彰化县| 华蓥市| 马公市| 塘沽区| 漠河县| 苍山县| 平顶山市| 博野县| 嘉荫县| 社会| 襄垣县| 吉林省| 东光县| 无极县| 秀山| 曲松县| 合作市| 久治县| 东阿县| 拉萨市| 南靖县| 山东省|