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

在2023idea中實(shí)現(xiàn)SpringBoot的IoC和AOP的方法

 更新時(shí)間:2024年11月11日 10:31:27   作者:我是大佬的大佬  
這篇文檔詳細(xì)介紹了如何在Spring Boot中實(shí)現(xiàn)IoC(控制反轉(zhuǎn))和AOP(面向切面編程),深入探討了AOP的基本概念,包括AOP的作用、優(yōu)勢(shì)以及實(shí)現(xiàn)方式,最后,它提到了AOP的注解,如@Aspect、@Pointcut、@Before、@After、@AfterReturning、@AfterThrowing和@Around

一.代碼介紹

(一)創(chuàng)建名為studentDao的接口

在com.example.demo包下創(chuàng)建一層dao包,在dao包下建一個(gè)名為studentDao的接口

package com.example.demo.dao;
public interface studentDao {
    public void insertStudent();
}

(二)創(chuàng)建名為studentDaoImpl的類 

在dao包下建一個(gè)impl包,在impl包下建一個(gè)名為studentDaoImpl的類

package com.example.demo.dao.impl;
import com.example.demo.dao.studentDao;
import org.springframework.stereotype.Repository;
@Repository//Dao層一般用這個(gè)。表示的是當(dāng)這個(gè)類被掃描到的時(shí)候,會(huì)自動(dòng)創(chuàng)建該類的對(duì)象,把它裝載到ioc容器當(dāng)中供調(diào)用
public class studentDaoImpl implements studentDao {
    @Override
    public void insertStudent() {
        System.out.println("insertStudent被調(diào)用");
    }
}

(三)創(chuàng)建名為studentService的接口

在com.example.demo包下創(chuàng)建一層service包,在service包下建一個(gè)名為studentDao的接口

package com.example.demo.service;
public interface studentService {
    public void saveStudent();
}

(四)創(chuàng)建名為studentServiceImpl的類

在service包下建一個(gè)impl包,在impl包下建一個(gè)名為studentServiceImpl的類

package com.example.demo.service.impl;
import com.example.demo.dao.studentDao;
import com.example.demo.service.studentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("studentService")//Service層中一般用這個(gè)。括號(hào)里面表示的是:id已經(jīng)不是類名了,變成括號(hào)里面的studentService
public class studentServiceImpl implements studentService {
    @Autowired//依賴注入中最常用的。表示的是會(huì)到容器中按照類型查找和裝配進(jìn)ioc容器
    private com.example.demo.dao.studentDao studentDao; //應(yīng)用Dao層的東西
    @Override
    public void saveStudent() {
        studentDao.insertStudent();
    }
}

(五)創(chuàng)建名為MyAspect的類

 在com.example.demo包下創(chuàng)建一層config包,在config包下建一個(gè)名為MyAspect的類

package com.example.demo.config;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Aspect //表示是一個(gè)切面類
//@Component//表示自動(dòng)化實(shí)例對(duì)象
@Configuration//表示的是一個(gè)配置類,是用來(lái)替換配置文件的
public class MyAspect {
    @Before("execution(* *.*.demo.*.impl.studentDaoImpl.insertStudent(..))")//切點(diǎn)表達(dá)式的簡(jiǎn)略寫法 *表示對(duì)一個(gè)或者多個(gè)包沒(méi)有限制/也表示對(duì)訪問(wèn)修飾符和返回類型無(wú)所謂   函數(shù)名(..)中的..表示對(duì)函數(shù)中的參數(shù)沒(méi)有限制
    public void  ad(){
    }
    @Pointcut("execution(public void com.example.demo.dao.impl.studentDaoImpl.insertStudent())")//切點(diǎn)表達(dá)式
    public void pointcut(){
    }
    @Before("pointcut()")//切點(diǎn)表達(dá)式簡(jiǎn)化
    public void before(){
        System.out.println("我是前置通知,我要在insertStudent方法之前執(zhí)行");
    }
}

(六)Demo1ApplicationTests

在test包下找到名為Demo1ApplicationTests的類

package com.example.demo;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Demo1ApplicationTests {
   /*
   @Autowired
   @Qualifier("studentService")      這兩個(gè)可以用 @Resource(name="studentService")直接調(diào)換
    */
    @Resource(name="studentService")//自動(dòng)裝配
   private com.example.demo.service.studentService studentService;//這里要用全限定類名來(lái)聲明
    @Autowired//依賴注入中最常用的。表示的是會(huì)到bean容器中按照類型查找和裝配進(jìn)ioc容器
    private com.example.demo.dao.studentDao studentDao;
    @Test//測(cè)試類
    void contextLoads() {
    }
    @Test
    public void testAnnoioc(){
        studentService.saveStudent();
    }
    @Test
    public void testaspect(){
        studentDao.insertStudent();
    }
}

(七)導(dǎo)入spring-boot-starter-aop依賴

在pom.xml中導(dǎo)入spring-boot-starter-aop依賴

1.file->Settings->Plugins->搜索maven-search下載應(yīng)用

2.Tools->Maven Search->搜索spring-boot-starter-aop任意版本復(fù)制粘貼到pom.xml中

3.去版本號(hào)

4.如圖所示,一直刷新到出現(xiàn)Dependencies,其里面找到org.springframework.boot:spring-boot-starter-aop:3.0.2

Maven配置查看博主的上一條發(fā)布內(nèi)容

(八)運(yùn)行結(jié)果

二.IoC

(一)什么是IoC

IoC (Inversion of Control )即控制反轉(zhuǎn)/反轉(zhuǎn)控制。它是一種思想不是一個(gè)技術(shù)實(shí)現(xiàn)。描述的是:Java 開(kāi)發(fā)領(lǐng)域?qū)ο蟮膭?chuàng)建以及管理的問(wèn)題。

例如:現(xiàn)有類 A 依賴于類 B

傳統(tǒng)的開(kāi)發(fā)方式 :往往是在類 A 中手動(dòng)通過(guò) new 關(guān)鍵字來(lái) new 一個(gè) B 的對(duì)象出來(lái)

使用 IoC 思想的開(kāi)發(fā)方式 :不通過(guò) new 關(guān)鍵字來(lái)創(chuàng)建對(duì)象,而是通過(guò) IoC 容器(Spring 框架) 來(lái)幫助我們實(shí)例化對(duì)象。我們需要哪個(gè)對(duì)象,直接從 IoC 容器里面去取即可。

(二)為什么叫控制反轉(zhuǎn)

控制 :指的是對(duì)象創(chuàng)建(實(shí)例化、管理)的權(quán)力

反轉(zhuǎn) :控制權(quán)交給外部環(huán)境(IoC 容器)

(三)IOC 解決了什么問(wèn)題

IoC 的思想就是兩方之間不互相依賴,由第三方容器來(lái)管理相關(guān)資源。這樣有什么好處呢?

對(duì)象之間的耦合度或者說(shuō)依賴程度降低;資源變的容易管理;

比如你用 Spring 容器提供的話很容易就可以實(shí)現(xiàn)一個(gè)單例。

(四)IoC 最常見(jiàn)以及最合理的實(shí)現(xiàn)方式叫做依賴注入(Dependency Injection,簡(jiǎn)稱 DI)

(五)IoC注解 1.用于創(chuàng)建對(duì)象的

(1)@Repository:一般用于持久層(即Dao層)

作用:當(dāng)這個(gè)類被掃描到的時(shí)候,會(huì)自動(dòng)創(chuàng)建該類的對(duì)象,把它裝載到ioc容器當(dāng)中供調(diào)用(用于把當(dāng)前類對(duì)象存入spring容器中)

屬性:value 用于指定 bean 的 id。當(dāng)我們不寫時(shí),他默認(rèn)值是當(dāng)前類名,且首字母改小寫。 屬性 value 當(dāng)只有一個(gè)值時(shí),value 書寫可以省略。

如: 在IOC容器反射創(chuàng)建 AccountServiceImpl 的對(duì)象的時(shí)候。如果不傳入?yún)?shù),則表現(xiàn)層:
IAccountService as = (IAccountService) ac.getBean("accountServiceImpl");

也可以通過(guò)在類上面配置 @Component("accountService"),則表現(xiàn)層傳入的參數(shù)應(yīng)保持一樣:
IAccountService as = (IAccountService) ac.getBean("accountService");

(2)@Component:表示自動(dòng)實(shí)例化對(duì)象

(3)@Controller:一般用在表現(xiàn)層(即Controller層)

(4)@Service:一般用在業(yè)務(wù)層(即Service層)

以上三個(gè)注解他們的作用和屬性與 Component 是一模一樣的,因此可以混用。

2.用于注入數(shù)據(jù)的

(1)@Autowired----依賴注入中最常用的

作用:會(huì)到容器中按照類型查找和裝配進(jìn)IoC容器

(自動(dòng)按照類型注入: 只要容器中有唯一的一個(gè) bean 對(duì)象類型和要注入的數(shù)據(jù)類型匹配,就可以注入成功;如果 ioc 容器中沒(méi)有任何 bean 的類型和要注入的變量類型匹配,則報(bào)錯(cuò);如果 ioc 容器中有多個(gè) bean 的類型和要注入的變量類型匹配,先根據(jù) 數(shù)據(jù)類型 (如:IAccountDao)找到范圍,并在范圍中在根據(jù) 變量的名稱(如:accountDao)與 IOC 容器的 key 相匹配,最終注入。)
出現(xiàn)的位置: 可以是變量上,也可以是方法上
細(xì)節(jié):在使用 Autowired 注解注入時(shí),set 方法就不是必須的了。

(2)@Qualifier

作用:在按照類中注入的基礎(chǔ)之上再按照 value 注入。
他在給類成員注入時(shí)不能單獨(dú)(使用需和 Autowired 配合),但是在給方法參數(shù)注入時(shí)可以。

屬性:value 用于指定 bean 的 id,無(wú)須考慮 Autowired,但是還需要寫上 Autowired。eg:

@Autowired
@Qualifier("accountDao1")
private IAccountDao accountDao = null;

(3)@Resource

作用:直接按照 bean 的 id 注入。它可以獨(dú)立使用。

屬性:name 用于指定 bean 的 id。如:

@Resource(name = "accountDao1")
private IAccountDao accountDao = null ;

以上三個(gè)注入只能注入其他的 bean 類型的數(shù)據(jù),而基本類型和 String 類型無(wú)法使用上述注解實(shí)現(xiàn)。
另外,集合類型的注入只能通過(guò) XML 來(lái)實(shí)現(xiàn)。

(4)@Value

作用:用于注入基本類型和 String 類型的數(shù)據(jù)

屬性:value 用于指定數(shù)據(jù)的值。
它可以使用 spring 中的 SpEl(也就是 spring 的 el 表達(dá)式),SpEl的寫法也是  ${表達(dá)式}

3.用于改變作用范圍的 @Scope

作用:用于指定bean的作用范圍

屬性:value 指定范圍的取值。常用取值:singleton, prototype
@Scope(“prototype”)
在類上使用,如:

@Component("accountService")
@Scope("prototype")
public class AccountServiceImpl implements IAccountService {...}

4.和生命周期相關(guān)

他們的作用就和在 bean 標(biāo)簽中使用 init-method 和 destroy-method 的作用是一樣的

(1)@PostConstruct

作用:用于指定初始化方法

(2)@PreDestroy

作用:用于指定銷毀方法

@PostConstruct
public void init(){
	System.out.println("初始化");
}
@PreDestroy
public void destroy(){
	System.out.println("銷毀方法Service");//這里單例對(duì)象需要手動(dòng)關(guān)閉才會(huì)執(zhí)行該方法
}

三.AOP

(一)什么是AOP

AOP:在軟件業(yè),AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù),是軟件開(kāi)發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開(kāi)發(fā)的效率。

(二)AOP 的作用及其優(yōu)勢(shì)

作用:在程序運(yùn)行期間,在不修改源碼的情況下對(duì)方法進(jìn)行功能增強(qiáng)
優(yōu)勢(shì):減少重復(fù)代碼,提高開(kāi)發(fā)效率,并且便于維護(hù)

(三)AOP 的底層實(shí)現(xiàn)

AOP 的底層是通過(guò) Spring 提供的的動(dòng)態(tài)代理技術(shù)實(shí)現(xiàn)的。在運(yùn)行期間,Spring通過(guò)動(dòng)態(tài)代理技術(shù)動(dòng)態(tài)的生成代理對(duì)象,代理對(duì)象方法執(zhí)行時(shí)進(jìn)行增強(qiáng)功能的介入,在去調(diào)用目標(biāo)對(duì)象的方法,從而完成功能的增強(qiáng)。

(四)常用的動(dòng)態(tài)代理技術(shù)

JDK 代理 : 基于接口的動(dòng)態(tài)代理技術(shù)
cglib 代理:基于父類的動(dòng)態(tài)代理技術(shù)

(五)AOP相關(guān)概念

1.Target(目標(biāo)對(duì)象):代理的目標(biāo)對(duì)象   (織入 Advice 的目標(biāo)對(duì)象.。)
2.Proxy (代理):一個(gè)類被 AOP 織入增強(qiáng)后,就產(chǎn)生一個(gè)結(jié)果代理類    
3.Joinpoint(連接點(diǎn)):所謂連接點(diǎn)是指那些被攔截到的點(diǎn)。在spring中,這些點(diǎn)指的是方法,因?yàn)閟pring只支持方法類型的連接點(diǎn)。(表示在程序中明確定義的點(diǎn),典型的包括方法調(diào)用,對(duì)類成員的訪問(wèn)以及異常處理程序塊的執(zhí)行等等,它自身還可以嵌套其它 joint point。)
4.Pointcut(切入點(diǎn)):所謂切入點(diǎn)是指我們要對(duì)哪些 Joinpoint 進(jìn)行攔截的定義。(表示一組 joint point,這些 joint point 或是通過(guò)邏輯關(guān)系組合起來(lái),或是通過(guò)通配、正則表達(dá)式等方式集中起來(lái),它定義了相應(yīng)的 Advice 將要發(fā)生的地方。)       
5.Advice(通知/ 增強(qiáng)):所謂通知是指攔截到 Joinpoint 之后所要做的事情就是通知  (Advice 定義了在 Pointcut 里面定義的程序點(diǎn)具體要做的操作,它通過(guò) before、after 和 around 來(lái)區(qū)別是在每個(gè) joint point 之前、之后還是代替執(zhí)行的代碼。)     
6.Aspect(切面):是切入點(diǎn)和通知的結(jié)合( Aspect 聲明類似于 Java 中的類聲明,在 Aspect 中會(huì)包含著一些 Pointcut 以及相應(yīng)的 Advice。)
7.Weaving(織入):是指把增強(qiáng)應(yīng)用到目標(biāo)對(duì)象來(lái)創(chuàng)建新的代理對(duì)象的過(guò)程。spring采用動(dòng)態(tài)代理織入,而AspectJ采用編譯期織入和類裝載期織入。 安裝的過(guò)程(將 Aspect 和其他對(duì)象連接起來(lái), 并創(chuàng)建 Adviced object 的過(guò)程)

(六)AOP注解

1.@Aspect

位置:類定義上方

作用:設(shè)置當(dāng)前類為切面類

格式:

@Aspect
public class AopAdvice {
}

說(shuō)明:一個(gè)beans標(biāo)簽中可以配置多個(gè)aop:config標(biāo)簽

2.@Pointcut

位置:方法定義上方

作用:使用當(dāng)前方法名作為切入點(diǎn)引用名稱

格式:

@Pointcut("execution(* *(..))")
public void pt() {
}

說(shuō)明:被修飾的方法忽略其業(yè)務(wù)功能,格式設(shè)定為無(wú)參無(wú)返回值的方法,方法體內(nèi)空實(shí)現(xiàn)(非抽象)

3.@Before

位置:方法定義上方

作用:標(biāo)注當(dāng)前方法作為前置通知

格式:

@Before("pt()")
public void before(){
}

無(wú)特殊參數(shù)

4.@After

位置:方法定義上方

作用:標(biāo)注當(dāng)前方法作為后置通知

格式:

@After("pt()")
public void after(){
}

無(wú)特殊參數(shù)

5.@AfterReturning

位置:方法定義上方

作用:標(biāo)注當(dāng)前方法作為返回后通知

格式:

@AfterReturning(value="pt()",returning = "ret")
public void afterReturning(Object ret) {
}

特殊參數(shù):

returning :設(shè)定使用通知方法參數(shù)接收返回值的變量名

6.@AfterThrowing

位置:方法定義上方

作用:標(biāo)注當(dāng)前方法作為異常后通知

格式:

@AfterThrowing(value="pt()",throwing = "t")
public void afterThrowing(Throwable t){
}

特殊參數(shù):

throwing :設(shè)定使用通知方法參數(shù)接收原始方法中拋出的異常對(duì)象名

7.@Around

位置:方法定義上方

作用:標(biāo)注當(dāng)前方法作為環(huán)繞通知

格式:

@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
    Object ret = pjp.proceed();
    return ret;
}

無(wú)特殊參數(shù)

到此這篇關(guān)于在2023idea中如何實(shí)現(xiàn)SpringBoot的IoC和AOP的文章就介紹到這了,更多相關(guān)idea中實(shí)現(xiàn)SpringBoot的IoC和AOP內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中的事務(wù)隔離級(jí)別的介紹

    Spring中的事務(wù)隔離級(jí)別的介紹

    今天小編就為大家分享一篇關(guān)于Spring中的事務(wù)隔離級(jí)別的介紹,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Maven項(xiàng)目中出現(xiàn)“非法字符:?65279”錯(cuò)誤的解決辦法

    Maven項(xiàng)目中出現(xiàn)“非法字符:?65279”錯(cuò)誤的解決辦法

    在使用Maven進(jìn)行項(xiàng)目構(gòu)建時(shí),有時(shí)會(huì)遇到一些意想不到的問(wèn)題,其中一個(gè)常見(jiàn)的問(wèn)題是遇到非法字符???65279??,這個(gè)字符通常被稱為零寬度無(wú)斷行空格(Zero-width?no-break?space),本文將詳細(xì)介紹如何識(shí)別和解決這個(gè)問(wèn)題,需要的朋友可以參考下
    2025-12-12
  • Java引用傳遞實(shí)現(xiàn)方式以及與值傳遞的區(qū)別

    Java引用傳遞實(shí)現(xiàn)方式以及與值傳遞的區(qū)別

    這篇文章主要給大家介紹了關(guān)于Java引用傳遞實(shí)現(xiàn)方式以及與值傳遞的區(qū)別的相關(guān)資料,引用傳遞指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址直接傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù),需要的朋友可以參考下
    2023-09-09
  • SpringBoot集成Spring AI構(gòu)建AI智能客服模塊

    SpringBoot集成Spring AI構(gòu)建AI智能客服模塊

    本文介紹了如何在SpringBoot項(xiàng)目中集成AI能力,包括創(chuàng)建項(xiàng)目、配置API密鑰、開(kāi)發(fā)AI對(duì)話服務(wù)以及測(cè)試驗(yàn)證,重點(diǎn)在于通過(guò)簡(jiǎn)單的示例展示AI對(duì)話的基本實(shí)現(xiàn),為后續(xù)更復(fù)雜的進(jìn)階功能鋪墊基礎(chǔ),需要的朋友可以參考下
    2026-04-04
  • springcloud微服務(wù)基于redis集群的單點(diǎn)登錄實(shí)現(xiàn)解析

    springcloud微服務(wù)基于redis集群的單點(diǎn)登錄實(shí)現(xiàn)解析

    這篇文章主要介紹了springcloud微服務(wù)基于redis集群的單點(diǎn)登錄實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Spring如何通過(guò)注解存儲(chǔ)和讀取對(duì)象詳解

    Spring如何通過(guò)注解存儲(chǔ)和讀取對(duì)象詳解

    在Spring中,要想更簡(jiǎn)單的存儲(chǔ)和讀取對(duì)象的核心是使用注解,這篇文章主要給大家介紹了關(guān)于Spring如何通過(guò)注解存儲(chǔ)和讀取對(duì)象的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Java軟件設(shè)計(jì)模式之適配器模式詳解

    Java軟件設(shè)計(jì)模式之適配器模式詳解

    這篇文章主要介紹了Java軟件設(shè)計(jì)模式之適配器模式詳解,適配器模式可分為對(duì)象適配器和類適配器兩種,在對(duì)象適配器模式中,適配器與適配者之間是關(guān)聯(lián)關(guān)系;在類適配器模式中,適配器與適配者之間是繼承(或?qū)崿F(xiàn))關(guān)系,需要的朋友可以參考下
    2023-07-07
  • spring框架maven依賴pom配置教程

    spring框架maven依賴pom配置教程

    本文介紹了Spring框架核心模塊及常用擴(kuò)展的Maven依賴配置,涵蓋基礎(chǔ)依賴、常用模塊、版本管理建議、常見(jiàn)問(wèn)題及解決方法,并提供了完整的pom.xml示例,幫助開(kāi)發(fā)者高效構(gòu)建Spring應(yīng)用
    2025-10-10
  • Java中的值傳遞和引用傳遞實(shí)例介紹

    Java中的值傳遞和引用傳遞實(shí)例介紹

    java 中沒(méi)有引用傳遞,都是值傳遞的,可以通過(guò)傳遞副本修改對(duì)象的,副本交換,并不影響原引用
    2013-09-09
  • SpringBoot中Bean生命周期自定義初始化和銷毀方法詳解

    SpringBoot中Bean生命周期自定義初始化和銷毀方法詳解

    這篇文章給大家詳細(xì)介紹了SpringBoot中Bean生命周期自定義初始化和銷毀方法,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

河池市| 平武县| 焉耆| 高雄县| 郓城县| 聂荣县| 卓尼县| 太仓市| 富锦市| 嵊泗县| 新安县| 巫山县| 婺源县| 浙江省| 嘉兴市| 东乌| 六盘水市| 潮州市| 东方市| 夹江县| 甘南县| 湟源县| 平邑县| 宁化县| 英超| 博野县| 阳曲县| 榕江县| 会理县| 莲花县| 陇西县| 江油市| 临漳县| 当阳市| 铜山县| 富源县| 朔州市| 石首市| 宁南县| 房产| 方正县|