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

Spring Bean作用域詳解之從單例到自定義作用域的全面指南

 更新時(shí)間:2026年01月04日 10:09:52   作者:海南java第二人  
本文詳細(xì)介紹了Spring框架中的六種標(biāo)準(zhǔn)Bean作用域,包括singleton、prototype、request、session、application和websocket,并探討了如何根據(jù)業(yè)務(wù)需求選擇合適的Bean生命周期管理策略,感興趣的朋友跟隨小編一起看看吧

一、引言

在Spring框架的日常開發(fā)中,Bean的作用域(Scope)是一個(gè)基礎(chǔ)而重要的概念。正確地理解和應(yīng)用不同的作用域,不僅能夠優(yōu)化內(nèi)存使用,還能確保應(yīng)用在多線程環(huán)境下的數(shù)據(jù)安全。本文將深入探討Spring支持的六種標(biāo)準(zhǔn)作用域,以及如何根據(jù)業(yè)務(wù)需求選擇合適的Bean生命周期管理策略。

二、什么是Bean作用域?

Bean作用域定義了Bean實(shí)例在Spring容器中的生命周期和可見性范圍。簡(jiǎn)單來說,它決定了:

  • Bean實(shí)例何時(shí)被創(chuàng)建
  • 實(shí)例在容器中存活多久
  • 每次請(qǐng)求時(shí)是返回同一個(gè)實(shí)例還是新的實(shí)例

Spring框架提供了靈活的作用域機(jī)制,開發(fā)者可以根據(jù)應(yīng)用場(chǎng)景選擇最合適的Scope配置。

三、Spring的六種標(biāo)準(zhǔn)作用域詳解

1. singleton(單例模式)- 默認(rèn)作用域

核心特性

singleton是Spring容器默認(rèn)的作用域。在這個(gè)模式下,整個(gè)IoC容器中只存在一個(gè)Bean的實(shí)例。無論通過依賴注入還是getBean()方法獲取,返回的都是同一個(gè)對(duì)象引用。

配置方式

// 使用注解配置
@Component
@Scope("singleton")  // 或省略,默認(rèn)就是singleton
public class UserService {
    // 業(yè)務(wù)邏輯
}
// 使用XML配置
<bean id="userService" class="com.example.UserService" scope="singleton"/>

適用場(chǎng)景與最佳實(shí)踐

? 推薦使用

  • 無狀態(tài)的工具類(如StringUtils、DateUtils)
  • 服務(wù)層組件(Service)
  • 數(shù)據(jù)訪問層組件(DAO)
  • 配置類(Configuration)
  • 工廠類(Factory)

? 避免使用

  • 包含可變狀態(tài)且多線程共享的類
  • 需要線程隔離的業(yè)務(wù)對(duì)象

內(nèi)存與性能考量

singleton作用域最大的優(yōu)勢(shì)在于節(jié)省內(nèi)存和初始化開銷。由于只創(chuàng)建一次,適合那些初始化成本高、頻繁使用的組件。

@Service
public class CacheManager {
    private final Map<String, Object> cache = new ConcurrentHashMap<>();
    // 這個(gè)場(chǎng)景適合singleton,因?yàn)榫彺嫘枰止蚕?
}

2. prototype(原型模式)

核心特性

prototype作用域每次請(qǐng)求Bean時(shí)都會(huì)創(chuàng)建一個(gè)全新的實(shí)例。Spring容器創(chuàng)建實(shí)例后,會(huì)將控制權(quán)完全交給客戶端,不再管理其生命周期。

配置方式

@Component
@Scope("prototype")
public class ShoppingCart {
    private List<Item> items = new ArrayList<>();
    public void addItem(Item item) {
        items.add(item);
    }
}
// XML配置
<bean id="shoppingCart" class="com.example.ShoppingCart" scope="prototype"/>

適用場(chǎng)景

? 強(qiáng)烈推薦使用

  • 包含狀態(tài)的業(yè)務(wù)對(duì)象(如購(gòu)物車、用戶會(huì)話)
  • 需要線程隔離的數(shù)據(jù)處理器
  • 短暫使用的一次性對(duì)象
  • 可能被修改的DTO(數(shù)據(jù)傳輸對(duì)象)
@Component
@Scope("prototype")
public class ReportGenerator {
    private ReportData data;
    private ReportFormat format;
    // 每個(gè)報(bào)表生成都需要獨(dú)立的實(shí)例
    public Report generate() {
        // 生成報(bào)表邏輯
    }
}

生命周期管理要點(diǎn)

重要提示:prototype作用域的Bean需要客戶端自行管理銷毀。Spring容器不會(huì)調(diào)用其銷毀方法(如@PreDestroy)。

@Component
@Scope("prototype")
public class ResourceHolder implements DisposableBean {
    private ExpensiveResource resource;
    public ResourceHolder() {
        this.resource = new ExpensiveResource();
    }
    @Override
    public void destroy() {
        // 需要客戶端手動(dòng)調(diào)用,Spring不會(huì)自動(dòng)調(diào)用
        resource.close();
    }
}

3. request(HTTP請(qǐng)求作用域)

核心特性

request作用域?yàn)槊總€(gè)HTTP請(qǐng)求創(chuàng)建一個(gè)Bean實(shí)例。這個(gè)實(shí)例在整個(gè)請(qǐng)求處理期間(包括所有過濾器、攔截器、控制器、視圖渲染)都是可用的。

配置方式

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestContext {
    private String requestId;
    private Long userId;
    public RequestContext() {
        this.requestId = UUID.randomUUID().toString();
    }
}
// XML配置
<bean id="requestContext" class="com.example.RequestContext" scope="request"/>

適用場(chǎng)景

? 典型使用場(chǎng)景

  • 請(qǐng)求級(jí)別的數(shù)據(jù)封裝
  • 請(qǐng)求跟蹤和日志記錄
  • 表單數(shù)據(jù)綁定
  • 權(quán)限驗(yàn)證信息傳遞

必須的Web配置

<!-- web.xml配置 -->
<web-app>
    <!-- 方式1:使用監(jiān)聽器 -->
    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>
    <!-- 方式2:使用過濾器 -->
    <filter>
        <filter-name>requestContextFilter</filter-name>
        <filter-class>
            org.springframework.web.filter.RequestContextFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>requestContextFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

4. session(HTTP會(huì)話作用域)

核心特性

session作用域?yàn)槊總€(gè)用戶會(huì)話創(chuàng)建一個(gè)Bean實(shí)例,該實(shí)例在會(huì)話期間(用戶與應(yīng)用的交互周期)持續(xù)存在。

配置方式

@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserSession {
    private String sessionId;
    private UserInfo userInfo;
    private LocalDateTime loginTime;
    private List<String> permissions;
    // 會(huì)話管理方法
    public boolean isValid() {
        return userInfo != null;
    }
}

適用場(chǎng)景

? 理想應(yīng)用場(chǎng)景

  • 用戶登錄狀態(tài)管理
  • 購(gòu)物車信息存儲(chǔ)
  • 用戶偏好設(shè)置
  • 多步表單流程數(shù)據(jù)

會(huì)話超時(shí)處理

@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ShoppingCart implements HttpSessionBindingListener {
    private List<Product> products = new ArrayList<>();
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        log.info("購(gòu)物車已綁定到會(huì)話: {}", event.getSession().getId());
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        log.info("會(huì)話過期,清理購(gòu)物車數(shù)據(jù)");
        products.clear();
    }
}

5. application(Servlet上下文作用域)

核心特性

application作用域的Bean在整個(gè)Web應(yīng)用程序中共享,類似于單例模式,但是與ServletContext綁定,而不是Spring應(yīng)用上下文。

配置方式

@Component
@Scope(WebApplicationContext.SCOPE_APPLICATION)
public class ApplicationConfig {
    private Properties appProperties;
    private Map<String, String> systemConfig;
    @PostConstruct
    public void init() {
        // 加載應(yīng)用級(jí)配置
        loadConfiguration();
    }
}

適用場(chǎng)景

? 最佳使用場(chǎng)景

  • 應(yīng)用程序全局配置
  • 共享的緩存數(shù)據(jù)
  • 系統(tǒng)級(jí)別的資源管理
  • 應(yīng)用啟動(dòng)時(shí)的初始化數(shù)據(jù)

6. websocket(WebSocket會(huì)話作用域)

核心特性

websocket作用域?yàn)槊總€(gè)WebSocket會(huì)話創(chuàng)建一個(gè)Bean實(shí)例,適用于實(shí)時(shí)通信應(yīng)用。

配置方式

@Component
@Scope(scopeName = "websocket")
public class WebSocketSessionHandler {
    private String sessionId;
    private WebSocketSession session;
    private Queue<Message> messageQueue = new ConcurrentLinkedQueue<>();
    // WebSocket消息處理
    public void handleMessage(Message message) {
        messageQueue.offer(message);
    }
}

適用場(chǎng)景

? 專為WebSocket設(shè)計(jì)

  • 實(shí)時(shí)聊天應(yīng)用
  • 股票行情推送
  • 在線游戲狀態(tài)管理
  • 協(xié)同編輯應(yīng)用

四、作用域配置的進(jìn)階技巧

代理模式的選擇

當(dāng)短生命周期作用域(如request、session)被長(zhǎng)生命周期作用域(如singleton)引用時(shí),需要使用代理:

// 正確配置:使用CGLIB代理
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserPreferences {
    private String theme;
    private String language;
}
// 在單例Bean中安全注入
@Service
public class UserService {
    // Spring會(huì)注入一個(gè)代理對(duì)象,每次調(diào)用時(shí)獲取當(dāng)前會(huì)話的真實(shí)實(shí)例
    @Autowired
    private UserPreferences userPreferences;
}

單例Bean中引用原型Bean的解決方案

問題場(chǎng)景

@Service  // 單例
public class OrderService {
    @Autowired
    private ShoppingCart cart;  // 原型,但實(shí)際只會(huì)初始化一次!
    public void processOrder() {
        // 問題:所有訂單共享同一個(gè)購(gòu)物車
    }
}

解決方案1:使用Provider

@Service
public class OrderService {
    @Autowired
    private ObjectProvider<ShoppingCart> cartProvider;
    public void processOrder() {
        ShoppingCart cart = cartProvider.getObject();  // 每次獲取新實(shí)例
        // 處理訂單邏輯
    }
}

解決方案2:使用方法注入

@Service
public abstract class OrderService {
    public void processOrder() {
        ShoppingCart cart = createShoppingCart();
        // 處理訂單邏輯
    }
    @Lookup
    protected abstract ShoppingCart createShoppingCart();
}

解決方案3:實(shí)現(xiàn)ApplicationContextAware

@Service
public class OrderService implements ApplicationContextAware {
    private ApplicationContext context;
    @Override
    public void setApplicationContext(ApplicationContext context) {
        this.context = context;
    }
    public void processOrder() {
        ShoppingCart cart = context.getBean(ShoppingCart.class);
        // 處理訂單邏輯
    }
}

五、線程安全與作用域選擇

線程安全策略

作用域線程安全性要求建議
singleton必須線程安全使用無狀態(tài)設(shè)計(jì)或同步機(jī)制
prototype通常安全每個(gè)線程有自己的實(shí)例
request線程安全每個(gè)請(qǐng)求獨(dú)立實(shí)例
session需要注意同一用戶可能并發(fā)請(qǐng)求
application必須線程安全全局共享,需同步訪問

最佳實(shí)踐示例

@Component
@Scope("singleton")
public class StatelessService {
    // 無狀態(tài)服務(wù),天然線程安全
    public Result calculate(Input input) {
        return new Result(input.value * 2);
    }
}
@Component
@Scope("prototype")
public class StatefulProcessor {
    private ThreadLocal<State> threadState = new ThreadLocal<>();
    public void process() {
        State state = threadState.get();
        if (state == null) {
            state = new State();
            threadState.set(state);
        }
        // 使用線程局部狀態(tài)
    }
}

六、自定義作用域?qū)崿F(xiàn)

場(chǎng)景:實(shí)現(xiàn)線程作用域

public class ThreadScope implements Scope {
    private final ThreadLocal<Map<String, Object>> threadLocal = 
        ThreadLocal.withInitial(HashMap::new);
    @Override
    public Object get(String name, ObjectFactory<?> objectFactory) {
        Map<String, Object> scope = threadLocal.get();
        Object object = scope.get(name);
        if (object == null) {
            object = objectFactory.getObject();
            scope.put(name, object);
        }
        return object;
    }
    @Override
    public Object remove(String name) {
        Map<String, Object> scope = threadLocal.get();
        return scope.remove(name);
    }
    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
        // 線程結(jié)束時(shí)清理
    }
    @Override
    public Object resolveContextualObject(String key) {
        return null;
    }
    @Override
    public String getConversationId() {
        return String.valueOf(Thread.currentThread().getId());
    }
}

注冊(cè)自定義作用域

@Configuration
public class ScopeConfig implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        // 注冊(cè)自定義作用域
        beanFactory.registerScope("thread", new ThreadScope());
    }
}
// 使用自定義作用域
@Component
@Scope("thread")
public class ThreadLocalCache {
    private Map<String, Object> cache = new HashMap<>();
    public void put(String key, Object value) {
        cache.put(key, value);
    }
}

七、作用域選擇的決策指南

選擇流程圖

實(shí)際案例決策

// 案例1:用戶認(rèn)證服務(wù) - 無狀態(tài),適合singleton
@Service  // 默認(rèn)singleton
public class AuthService {
    public boolean authenticate(String username, String password) {
        // 認(rèn)證邏輯,無狀態(tài)
    }
}
// 案例2:報(bào)表生成器 - 每次生成需要獨(dú)立狀態(tài),適合prototype
@Component
@Scope("prototype")
public class ReportGenerator {
    private ReportData data;
    private ReportFormat format;
    public Report generate() {
        // 生成報(bào)表
    }
}
// 案例3:購(gòu)物車 - 用戶會(huì)話級(jí)別,適合session
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ShoppingCart {
    private List<Item> items = new ArrayList<>();
    public void addItem(Item item) {
        items.add(item);
    }
}

八、常見陷阱與解決方案

陷阱1:?jiǎn)卫凶⑷朐虰ean

問題:期望每次獲取新實(shí)例,實(shí)際共享同一個(gè)實(shí)例。
解決:使用ObjectProvider@Lookup注解。

陷阱2:request/session作用域在非Web環(huán)境使用

問題:?jiǎn)?dòng)時(shí)拋出BeanCreationException。
解決:確保正確配置Web環(huán)境或使用條件化配置。

@Component
@Scope(
    value = WebApplicationContext.SCOPE_REQUEST, 
    proxyMode = ScopedProxyMode.TARGET_CLASS
)
@ConditionalOnWebApplication
public class RequestScopedBean {
    // 僅在Web環(huán)境生效
}

陷阱3:作用域代理導(dǎo)致的序列化問題

問題:CGLIB代理對(duì)象無法正確序列化。
解決:使用接口+JDK動(dòng)態(tài)代理。

public interface UserPreferences {
    String getTheme();
    void setTheme(String theme);
}
@Component
@Scope(
    value = "session", 
    proxyMode = ScopedProxyMode.INTERFACES  // 使用接口代理
)
public class UserPreferencesImpl implements UserPreferences, Serializable {
    private String theme;
    @Override
    public String getTheme() {
        return theme;
    }
    @Override
    public void setTheme(String theme) {
        this.theme = theme;
    }
}

九、性能優(yōu)化建議

作用域與內(nèi)存優(yōu)化

  1. 合理使用singleton:減少對(duì)象創(chuàng)建開銷
  2. 及時(shí)清理prototype:避免內(nèi)存泄漏
  3. session作用域數(shù)據(jù)最小化:只存儲(chǔ)必要數(shù)據(jù)
  4. request作用域及時(shí)釋放:請(qǐng)求結(jié)束后自動(dòng)回收

監(jiān)控與診斷

@Configuration
public class ScopeMonitoringConfig {
    @Bean
    public static BeanFactoryPostProcessor scopeMonitor() {
        return beanFactory -> {
            if (beanFactory instanceof ConfigurableListableBeanFactory) {
                ConfigurableListableBeanFactory configurableFactory = 
                    (ConfigurableListableBeanFactory) beanFactory;
                // 監(jiān)控Bean創(chuàng)建
                configurableFactory.addBeanPostProcessor(new BeanPostProcessor() {
                    @Override
                    public Object postProcessAfterInitialization(Object bean, String beanName) {
                        Scope scope = configurableFactory.getRegisteredScope(
                            configurableFactory.getBeanDefinition(beanName).getScope()
                        );
                        if (scope != null) {
                            log.info("Bean '{}' created with scope: {}", 
                                     beanName, scope.getClass().getSimpleName());
                        }
                        return bean;
                    }
                });
            }
        };
    }
}

十、總結(jié)與最佳實(shí)踐

核心要點(diǎn)回顧

  1. 默認(rèn)使用singleton:適用于大多數(shù)無狀態(tài)組件
  2. 有狀態(tài)選prototype:確保線程安全和狀態(tài)隔離
  3. Web作用域精確匹配:根據(jù)數(shù)據(jù)生命周期選擇request/session/application
  4. 注意代理配置:避免作用域注入問題
  5. 考慮線程安全:根據(jù)作用域設(shè)計(jì)并發(fā)策略

進(jìn)階建議

  • 作用域組合使用:合理搭配不同作用域?qū)崿F(xiàn)復(fù)雜業(yè)務(wù)
  • 自定義作用域:應(yīng)對(duì)特殊業(yè)務(wù)場(chǎng)景
  • 持續(xù)監(jiān)控:關(guān)注內(nèi)存使用和性能表現(xiàn)
  • 文檔化:團(tuán)隊(duì)內(nèi)明確作用域使用規(guī)范

十一、擴(kuò)展閱讀與資源

深入理解Spring容器

  • Spring IoC容器工作原理
  • Bean生命周期完整解析
  • 循環(huán)依賴解決方案
  • 條件化配置與Profile

性能調(diào)優(yōu)

  • 作用域選擇對(duì)性能的影響
  • 內(nèi)存泄漏預(yù)防策略
  • 并發(fā)場(chǎng)景下的最佳實(shí)踐

如需獲取更多關(guān)于Spring IoC容器深度解析、Bean生命周期管理、循環(huán)依賴解決方案、條件化配置等內(nèi)容,請(qǐng)持續(xù)關(guān)注本專欄《Spring核心技術(shù)深度剖析》系列文章。

到此這篇關(guān)于Spring Bean作用域詳解之從單例到自定義作用域的全面指南的文章就介紹到這了,更多相關(guān)Spring Bean作用域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java為什么不建議用equals判斷對(duì)象相等

    java為什么不建議用equals判斷對(duì)象相等

    本文主要介紹了java為什么不建議用equals判斷對(duì)象相等,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • java實(shí)現(xiàn)多層級(jí)zip解壓的示例代碼

    java實(shí)現(xiàn)多層級(jí)zip解壓的示例代碼

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)多層級(jí)zip解壓的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-12-12
  • IntelliJ IDEA 中必有得插件和配置

    IntelliJ IDEA 中必有得插件和配置

    這篇文章主要介紹了IntelliJ IDEA 中必有得插件和配置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java中的volatile關(guān)鍵字解析

    Java中的volatile關(guān)鍵字解析

    這篇文章主要介紹了Java中的volatile關(guān)鍵字解析,Java內(nèi)存模型規(guī)定了所有的變量都存儲(chǔ)在主內(nèi)存中,每個(gè)線程都有自己的工作內(nèi)存,線程的工作內(nèi)存保存了該線程使用到的變量的是主內(nèi)存副本的拷貝,需要的朋友可以參考下
    2023-11-11
  • SpringBoot實(shí)現(xiàn)不同接口指定上傳文件大小的具體步驟

    SpringBoot實(shí)現(xiàn)不同接口指定上傳文件大小的具體步驟

    這篇文章主要介紹了在Spring Boot中通過自定義注解、AOP攔截和配置文件實(shí)現(xiàn)不同接口上傳文件大小限制的方法,強(qiáng)調(diào)需設(shè)置全局閾值遠(yuǎn)大于接口自定義值,確保驗(yàn)證邏輯正確執(zhí)行,需要的朋友可以參考下
    2025-08-08
  • Java線程讓步y(tǒng)ield用法實(shí)例分析

    Java線程讓步y(tǒng)ield用法實(shí)例分析

    這篇文章主要介紹了Java線程讓步y(tǒng)ield用法,結(jié)合實(shí)例形式分析了java中yield()方法的功能、原理及線程讓步操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-09-09
  • 解讀Java和JavaScript區(qū)別與聯(lián)系

    解讀Java和JavaScript區(qū)別與聯(lián)系

    這篇文章主要介紹了解讀Java和JavaScript區(qū)別與聯(lián)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Mybatis-Plus如何配置分頁(yè)對(duì)象

    Mybatis-Plus如何配置分頁(yè)對(duì)象

    本文主要介紹了Mybatis-Plus如何配置分頁(yè)對(duì)象,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 微信小程序錄音文件格式silk遇到的問題及解決方法

    微信小程序錄音文件格式silk遇到的問題及解決方法

    錄音文件為silk格式,說是silk其實(shí)是base64加密后的webm格式,只需將其轉(zhuǎn)為webm格式即可。但是在處理過程中遇到各種坑,下面小編給大家?guī)砹宋⑿判〕绦蜾浺粑募袷絪ilk遇到的問題及解決方法,感興趣的朋友一起看看吧
    2018-09-09
  • HttpClient的RedirectStrategy重定向處理核心機(jī)制

    HttpClient的RedirectStrategy重定向處理核心機(jī)制

    這篇文章主要為大家介紹了HttpClient的RedirectStrategy重定向處理核心機(jī)制源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評(píng)論

商河县| 塔河县| 商河县| 抚顺县| 饶河县| 呼玛县| 隆尧县| 河北区| 罗城| 沾益县| 鄢陵县| 诸暨市| 囊谦县| 咸宁市| 收藏| 横峰县| 宾川县| 榆林市| 出国| 高清| 甘泉县| 瓦房店市| 彰化市| 抚松县| 偏关县| 宿迁市| 淮滨县| 修文县| 高唐县| 汉寿县| 张掖市| 平利县| 富阳市| 清水县| 佳木斯市| 上思县| 南康市| 太原市| 噶尔县| 横峰县| 随州市|