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

Spring Boot場景啟動(dòng)器(Starters)從入門到精通

 更新時(shí)間:2025年10月31日 10:11:14   作者:南部余額  
本文給大家介紹Spring Boot場景啟動(dòng)器(Starters)完全指南:從入門到精通,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

什么是場景啟動(dòng)器?

定義:
場景啟動(dòng)器(Starters)Spring Boot 的核心特性之一,是一組預(yù)定義的依賴描述符(Maven工程),可以簡化Maven配置。它們通常提供了一種“一站式”服務(wù),預(yù)先添加所有必要的依賴來使用某個(gè)特定的功能,可以輕松地將相關(guān)技術(shù)棧集成到項(xiàng)目中。

  • 例如,如果你想要使用SpringJPA進(jìn)行數(shù)據(jù)庫訪問,你只需要添加spring-boot-starter-data-jpa依賴即可,它會(huì)自動(dòng)引入所有相關(guān)的依賴。

核心理念:

  • 開箱即用:添加一個(gè) starter 即可獲得完整的技術(shù)棧支持
  • 依賴管理:自動(dòng)解決版本兼容性問題
  • 自動(dòng)配置:基于 classpath 自動(dòng)配置相關(guān)組件

優(yōu)勢: 簡化整合、簡化開發(fā)、簡化配置

簡化整合(項(xiàng)目依賴):

  • springboot提供了一種場景啟動(dòng)器機(jī)制。
  • 場景啟動(dòng)器就是人為創(chuàng)建的maven整合工程。
  • 場景啟動(dòng)器中包含某個(gè)場景(方向)所有的依賴和配置類。
  • 場景啟動(dòng)器可以在普通maven工程使用,也可以在springboot工程使用
  • springboot工程才能發(fā)揮最大的功能:批量依賴導(dǎo)入、配置類自動(dòng)加載
  • 官方場景啟動(dòng)器命名:spring-boot-starter-xxx
  • 非官方場景啟動(dòng)器命名:xxx-spring-boot-starter

簡化開發(fā)(核心組件):

  • 無需我們寫任何的配置類和配置文件(IOC)
  • springboot在場景啟動(dòng)器中已經(jīng)提供所有的配置類
  • springboot框架自動(dòng)配置功能(原理)
  • springboot自動(dòng)配置原理會(huì)按需加載配置類,按需將組件加入到核心容器
  • 我們只需要專注業(yè)務(wù)邏輯編寫即可。

簡化配置(配置文件):

  • 固定配置文件的名稱和格式。application.properties、.yaml
  • 固定了部分功能的key(直接設(shè)置即可)
  • 固定的key大部分都有默認(rèn)值(約定大于配置)
  • 不僅可以使用@Value注解單個(gè)讀取,還可以使用@ConfigurationProperties注解批量讀取

下面列出一些常見的Spring Boot場景啟動(dòng)器:

  • spring-boot-starter: 核心啟動(dòng)器,包括自動(dòng)配置支持、日志和YAML。
  • spring-boot-starter-web: 用于構(gòu)建Web應(yīng)用程序,包括RESTful應(yīng)用程序,使用Spring MVC。默認(rèn)使用Tomcat作為內(nèi)嵌容器。
  • spring-boot-starter-data-redis: 使用Redis和Spring Data Redis。
  • spring-boot-starter-security: 使用Spring Security進(jìn)行身份驗(yàn)證和授權(quán)。
  • spring-boot-starter-thymeleaf: 使用Thymeleaf視圖構(gòu)建Web應(yīng)用程序。
  • spring-boot-starter-test: 用于測試Spring Boot應(yīng)用程序,包括JUnit、Hamcrest和Mockito。
  • spring-boot-starter-actuator: 添加生產(chǎn)就緒功能,如監(jiān)控和管理應(yīng)用程序。
  • spring-boot-starter-undertow: 使用Undertow作為內(nèi)嵌容器(替代Tomcat和Jetty)。
  • spring-boot-starter-log4j2: 使用Log4j2進(jìn)行日志記錄。

除了官方提供的啟動(dòng)器,還有很多第三方啟動(dòng)器,例如:

  • mybatis-spring-boot-starter: 用于集成MyBatis。
  • druid-spring-boot-starter: 用于集成阿里巴巴的Druid數(shù)據(jù)源。

官方和第三方的場景啟動(dòng)器區(qū)別?

  • 官方啟動(dòng)器的前綴為:spring-boot-starter,后跟項(xiàng)目名稱。
  • 第三方啟動(dòng)器的前綴為:項(xiàng)目名稱-spring-boot-starter。
  • mybatis是第三方場景啟動(dòng)器,它與web格式的區(qū)別在于它的名稱在前面。
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

SpringBoot父項(xiàng)目spring-boot-starter-parent主要作用?

我們創(chuàng)建SpringBoot項(xiàng)目時(shí),通常會(huì)導(dǎo)入spring-boot-starter-parent場景啟動(dòng)器作為父項(xiàng)目,幫助我們管理并簡化依賴的版本號(hào)。我們?cè)诖_定要導(dǎo)入的spring-boot-starter-parent版本后,后續(xù)的導(dǎo)入的依賴就不需要寫入版本信息了,spring-boot-starter-parent啟動(dòng)器會(huì)幫我們選擇合適的場景啟動(dòng)器的版本好信息。

spring-boot-starter-parent底層是如何幫助我們實(shí)現(xiàn)的場景啟動(dòng)器版本管理呢?

  • 首先spring-boot-starter-parent場景啟動(dòng)器繼承自spring-boot-dependencies,而spring-boot-dependencies的內(nèi)部通過使用dependencyManagement來管理這些依賴的版本號(hào)。
  • 也就是說實(shí)際完成版本號(hào)管理的是spring-boot-dependencies工程。
  • spring-boot-starter-parent的管理版本號(hào)的功能繼承自spring-boot-dependencies。
  • spring-boot-starter-parent主要功能在于管理一些通用的構(gòu)建配置,比如默認(rèn)的編譯器版本、資源過濾、插件配置等。

這樣的設(shè)計(jì)是為了將依賴管理(dependency management)和插件配置等分開,使得項(xiàng)目結(jié)構(gòu)更清晰。

在 Spring Boot 的源碼中,spring-boot-starter-parent 的 pom.xml 中確實(shí)指定了其父項(xiàng)目為 spring-boot-dependencies

這樣的層次結(jié)構(gòu)有以下好處:

  1. spring-boot-dependencies 主要定義了依賴管理(dependencyManagement)和插件管理(pluginManagement),即所有 依賴的版本號(hào)插件的版本號(hào)。
  2. spring-boot-starter-parent 則繼承自 spring-boot-dependencies,并添加了一些通用的構(gòu)建配置,比如默認(rèn)的編譯器版本、資源過濾、插件配置等。
  3. 當(dāng)用戶項(xiàng)目繼承 spring-boot-starter-parent 時(shí),不僅獲得了依賴版本管理,還獲得了一些構(gòu)建相關(guān)的默認(rèn)配置。

所以,我們可以這樣理解:

  • spring-boot-dependencies:定義了所有依賴的版本,即一個(gè)大的依賴管理矩陣。
  • spring-boot-starter-parent:在依賴管理的基礎(chǔ)上,增加了默認(rèn)的構(gòu)建配置(如 Maven 插件配置、資源過濾等)。

如果你查看 spring-boot-starter-parent 的 pom.xml,你會(huì)看到它并沒有重復(fù)定義依賴版本,而是通過繼承 spring-boot-dependencies 來獲得所有版本管理。同時(shí),它定義了一些其他元素,比如:

  • 默認(rèn)的 Java 版本
  • 資源過濾(包括占位符解析)
  • 插件配置(如 spring-boot-maven-plugin 的默認(rèn)配置)

因此,當(dāng)我們?cè)陧?xiàng)目中繼承 spring-boot-starter-parent 時(shí),我們實(shí)際上同時(shí)獲得了依賴管理和構(gòu)建配置兩方面的便利。

如果你不能繼承 spring-boot-starter-parent(比如已經(jīng)有一個(gè)父項(xiàng)目),那么你可以通過引入 spring-boot-dependencies 的依賴管理來獲得版本管理,但是構(gòu)建配置就需要自己處理了。

總結(jié):spring-boot-starter-parent 的父工程是 spring-boot-dependencies,前者繼承了后者的依賴管理,并補(bǔ)充了構(gòu)建配置。

這也就是為什么在Springboot工程中,很多依賴不需要寫版本號(hào)信息的原因。

maven從0開始搭建SpringBoot項(xiàng)目

1. pom文件導(dǎo)入SpringBoot父依賴

  • 導(dǎo)入父依賴。
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

spring-boot-starter-parent專業(yè)特性

  • 依賴管理(Dependency Management):統(tǒng)一管理所有Spring Boot相關(guān)依賴的版本
  • 插件配置(Plugin Configuration):預(yù)配置Maven插件,如spring-boot-maven-plugin
  • 資源過濾(Resource Filtering):自動(dòng)處理配置文件中的占位符替換
  • 屬性配置(Property Configuration):預(yù)定義Java版本、編碼等構(gòu)建屬性

spring-boot-starter-parent優(yōu)勢:

  • ? 開箱即用:不用操心版本兼容
  • ? 配置齊全:插件、編碼、Java版本都配好了
  • ? 社區(qū)標(biāo)準(zhǔn):遵循Spring Boot官方最佳實(shí)踐
  • ? 減少錯(cuò)誤:避免手動(dòng)配置出錯(cuò)

導(dǎo)入場景啟動(dòng)器

    <dependencies>
    		<!--spring mvc場景啟動(dòng)器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

2. 編寫SpringBootApplication啟動(dòng)類

我們通常將帶有@SpringBootApplication注解的類稱為啟動(dòng)類(或主類),它是Spring Boot應(yīng)用的入口點(diǎn)。

啟動(dòng)器類是一個(gè)配置類(Configuration Class),通過組合注解自動(dòng)配置機(jī)制,引導(dǎo) Spring 容器的啟動(dòng)過程,實(shí)現(xiàn)零配置或最小配置的應(yīng)用啟動(dòng)。

  • 使用SpringBoot注解@SpringBootApplication修飾類文件。
  • 在入口函數(shù)main()方法處,它會(huì)創(chuàng)建一個(gè)IOC容器。
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
    	// 啟動(dòng)tomcat和ioc容器
        SpringApplication.run(MainApplication.class, args);
    }
}

3. 創(chuàng)建控制器,測試SpringBoot項(xiàng)目能否正常啟動(dòng)

  • 訪問鏈接:localhost:8080/user/info,測試項(xiàng)目是否啟動(dòng)成功。
@RestController
@RequestMapping("user")
public class UserController {
    @RequestMapping("info")
    public String info(){
        return "hello";
    }
}

SpringBoot整合Spring MVC

Spring Boot 整合 Spring MVC 非常簡便,因?yàn)?Spring Boot 已經(jīng)為 Spring MVC 提供了自動(dòng)配置。

  • 我們只需要導(dǎo)入spring-boot-starter-web場景啟動(dòng)器即可。
  1. 創(chuàng)建SpringBoot項(xiàng)目,導(dǎo)入WEB場景啟動(dòng)器。
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
  1. 編寫控制器Controller
@RestController
@RequestMapping("user")
public class UserController {
    @GetMapping("info")
    public String info(){
        return "user";
    }
    @GetMapping("login")
    public String login(){
        return "login";
    }
}
  1. 訪問控制器地址
  • http://localhost:8080/user/info

什么是 WebMvcConfigurer?

WebMvcConfigurer 是 Spring MVC 框架中的一個(gè)核心接口,它提供了回調(diào)方法,允許開發(fā)者在 Spring MVC 自動(dòng)配置的基礎(chǔ)上進(jìn)行定制化擴(kuò)展。

  • WebMvcConfigurerSpring MVC 中用于自定義配置的核心接口,它提供了一種方式來自定義 Spring MVC 的行為,而無需完全重寫自動(dòng)配置。
  • Spring Boot 中,自動(dòng)配置已經(jīng)為我們配置好了 Spring MVC 的大部分默認(rèn)行為,但如果你需要添加攔截器、格式化器、視圖控制器等,就可以通過實(shí)現(xiàn) WebMvcConfigurer 接口來定制。
  • 我們通常使用WebMvcConfigurer來配置Spring MVC,它替代了傳統(tǒng)的XML配置方式。在Spring Boot中,我們通過實(shí)現(xiàn)WebMvcConfigurer接口并重寫所需的方法來定制MVC配置,比如攔截器、資源處理、跨域配置等。

主要意義:

  1. 提供集中化的配置點(diǎn)WebMvcConfigurer允許開發(fā)者在一個(gè)或多個(gè)配置類中集中管理MVC配置,這有助于保持配置的一致性和可維護(hù)性。而不是分散在多個(gè)地方(如XML配置、注解配置等)。
  2. 保持與Spring Boot的自動(dòng)配置協(xié)同工作:通過實(shí)現(xiàn)WebMvcConfigurer接口,我們可以自定義MVC配置,而不會(huì)完全覆蓋Spring Boot的自動(dòng)配置。這是因?yàn)镾pring Boot的WebMvcAutoConfiguration類已經(jīng)提供了默認(rèn)的MVC配置,并且它使用WebMvcConfigurer來允許自定義。這種方式遵循了“約定優(yōu)于配置”的原則,同時(shí)提供了靈活性。
  3. 支持多種自定義場景WebMvcConfigurer提供了多個(gè)方法,覆蓋了MVC的各個(gè)方面,包括攔截器、資源處理、跨域、視圖控制器、消息轉(zhuǎn)換器等。這意味著開發(fā)者可以在不破壞原有框架結(jié)構(gòu)的情況下,針對(duì)特定需求進(jìn)行定制。
  4. 促進(jìn)模塊化配置:通過實(shí)現(xiàn)WebMvcConfigurer,我們可以創(chuàng)建多個(gè)配置類,每個(gè)配置類負(fù)責(zé)一個(gè)特定的功能模塊(例如,安全模塊、API模塊、視圖模塊等)。這種模塊化的配置方式使得應(yīng)用更容易擴(kuò)展和維護(hù)。
  5. 便于測試和調(diào)試:由于配置是集中且明確的,因此可以更容易地編寫測試來驗(yàn)證配置是否正確,并且在調(diào)試時(shí)可以快速定位問題。
  6. 適應(yīng)現(xiàn)代Web開發(fā)需求:現(xiàn)代Web應(yīng)用通常需要處理靜態(tài)資源、跨域請(qǐng)求、異步處理、內(nèi)容協(xié)商等。WebMvcConfigurer提供了對(duì)應(yīng)的方法來配置這些特性,使應(yīng)用能夠滿足現(xiàn)代Web標(biāo)準(zhǔn)。

SpringBoot整合攔截器Interceptor

整合步驟

  1. 創(chuàng)建SpringBoot項(xiàng)目,選擇導(dǎo)入spring-boot-starter-web場景啟動(dòng)器。
  2. 編寫控制器UserController。
  3. 創(chuàng)建一個(gè)攔截器UserInterceptor實(shí)現(xiàn)HandlerInterceptor接口。
public class UserInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("攔截器 = preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("攔截器 = postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("攔截器 = afterCompletion");
    }
}
  1. 自定義Spring MVC配置類,實(shí)現(xiàn)WebMvcConfigurer接口。
  • WebMvcConfigurer Spring MVC 提供的一個(gè)接口,用于自定義 Spring MVC 的配置。在 Spring Boot 中,我們可以通過實(shí)現(xiàn)這個(gè)接口來覆蓋默認(rèn)的 MVC 配置,例如添加攔截器、格式化器、視圖控制器等。
@Configuration
public class SpringMvcConfiguration implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInterceptor())
                .addPathPatterns("/user/**")
                .excludePathPatterns("/user/login");
    }
}
  1. 訪問UserController控制器方法。
  • http://localhost:8080/user/info
  • 觸發(fā)攔截器
攔截器 = preHandle
攔截器 = postHandle
攔截器 = afterCompletion

SpringBoot外部配置

Spring Boot的外部配置是指從應(yīng)用代碼包外部獲取配置信息的機(jī)制。它允許開發(fā)者將配置信息(如數(shù)據(jù)庫連接、服務(wù)器端口等)從代碼中分離出來,使得應(yīng)用能夠在不修改源代碼和重新弄編譯的情況下適應(yīng)不同的運(yùn)行環(huán)境。

定義
外部配置:指不直接在應(yīng)用代碼中硬編碼配置值,而是通過外部源(如配置文件、環(huán)境變量、命令行參數(shù)等)來提供配置信息,Spring Boot會(huì)按照預(yù)定的優(yōu)先級(jí)順序加載這些配置。

含義

外部配置的含義在于實(shí)現(xiàn)配置與代碼的分離,它是一個(gè)分層、有序的配置加載系統(tǒng),它從多個(gè)預(yù)定義的位置讀取配置信息,并按照優(yōu)先級(jí)順序進(jìn)行合并,高優(yōu)先級(jí)的配置會(huì)覆蓋低優(yōu)先級(jí)的配置。使得應(yīng)用具有更好的可移植性和可維護(hù)性。通過外部配置,我們可以輕松地為不同環(huán)境(開發(fā)、測試、生產(chǎn))定義不同的配置,而無需修改代碼。

優(yōu)勢

  • 靈活性:應(yīng)用可以根據(jù)部署環(huán)境動(dòng)態(tài)改變配置,而無需重新編譯代碼。
  • 安全性:敏感信息(如密碼、密鑰)可以不寫在代碼中,而是通過外部配置傳入,減少泄露風(fēng)險(xiǎn)。
  • 環(huán)境適配:通過Profile機(jī)制,可以輕松切換不同環(huán)境的配置。
  • 運(yùn)維友好:運(yùn)維人員可以通過命令行參數(shù)或環(huán)境變量快速調(diào)整配置,無需理解代碼結(jié)構(gòu)。
  • 云原生支持:在容器化部署(如Docker)和云平臺(tái)(如Kubernetes)中,外部配置是標(biāo)準(zhǔn)做法,可以方便地通過環(huán)境變量或配置映射來注入配置。

Spring Boot 的外部配置是一個(gè)開放體系:

  • 有固定的:Spring Boot 核心框架提供的標(biāo)準(zhǔn)配置
  • 有擴(kuò)展的:各種 Starter 提供的領(lǐng)域特定配置(Mybatis-spring-boot-starter)
  • 有自定義的:開發(fā)者根據(jù)業(yè)務(wù)需求定義的任意配置

外部配置源
Spring Boot 可以以下面這些方式加載外部配置,優(yōu)先級(jí)從高到低(高優(yōu)先級(jí)配置會(huì)覆蓋低優(yōu)先級(jí)配置):

  1. 命令行參數(shù):通過java -jar命令傳遞的參數(shù),例如:java -jar app.jar --server.port=8081
  2. Java系統(tǒng)屬性:使用System.getProperties()獲取的屬性
  3. 操作系統(tǒng)環(huán)境變量
  4. 從jar包外部的配置文件:例如,在jar包同一目錄下的application-{profile}.propertiesapplication-{profile}.yml文件
  5. 從jar包內(nèi)部的配置文件:打包在jar包內(nèi)的application-{profile}.propertiesapplication-{profile}.yml文件
  6. 默認(rèn)配置:通過SpringApplication.setDefaultProperties設(shè)置的默認(rèn)屬性

此外,Spring Boot 還支持通過@PropertySource注解加載自定義的配置文件,但注意這個(gè)注解不會(huì)加載application.properties文件,而是加載指定的其他文件。

配置文件的加載位置
Spring Boot 會(huì)從以下位置加載application.propertiesapplication.yml文件:

  1. 當(dāng)前目錄的/config子目錄
  2. 當(dāng)前目錄
  3. classpath下的/config
  4. classpath根目錄

這些位置按優(yōu)先級(jí)從高到低排列,高位置的配置會(huì)覆蓋低位置的配置。

  • application.properties配置文件的優(yōu)先級(jí)高于application.yml。

功能配置

SpringBoot:配置端口和項(xiàng)目根路徑

server:
  port: 8080
  servlet:
    context-path: /demo

SpringBoot:多環(huán)境Profile配置和切換

Spring Boot 多環(huán)境配置允許我們?yōu)椴煌沫h(huán)境(如開發(fā)、測試、生產(chǎn))定義不同的配置。

我們可以通過配置文件(如application-{profile}.propertiesapplication-{profile}.yml)來指定不同環(huán)境的配置,然后通過激活不同的profile來切換環(huán)境。

除了主配置文件application.properties,還可以使用命名約定為application-{profile}.properties的配置文件。其中{profile}是激活的配置文件名稱。例如,application-dev.properties用于開發(fā)環(huán)境,application-prod.properties用于生產(chǎn)環(huán)境。

可以通過多種方式設(shè)置激活的profile,例如在配置文件中設(shè)置spring.profiles.active=dev,或者通過命令行參數(shù)--spring.profiles.active=dev

多環(huán)境配置的主要步驟:

  1. 創(chuàng)建多個(gè)配置文件,分別對(duì)應(yīng)不同的環(huán)境,例如:
src/main/resources/
├── application.yml           # 主配置文件,公共配置
├── application-dev.yml       # 開發(fā)環(huán)境配置
├── application-test.yml      # 測試環(huán)境配置
├── application-prod.yml      # 生產(chǎn)環(huán)境配置
└── application-staging.yml   # 預(yù)生產(chǎn)環(huán)境配置
  1. 在主配置文件application.yml中指定當(dāng)前激活的環(huán)境,或者通過其他方式(如命令行參數(shù)、環(huán)境變量)來設(shè)置激活的環(huán)境。
  • 主環(huán)境配置:默認(rèn)激活開發(fā)環(huán)境
# 默認(rèn)激活開發(fā)環(huán)境
spring:
  profiles:
    active: dev
  • 開發(fā)環(huán)境配置:application-dev.yml
# 開發(fā)環(huán)境配置:8080端口
server:
  port: 8080
  servlet:
    context-path: /
  • 生產(chǎn)環(huán)境配置:application-prod.yml
# 生產(chǎn)環(huán)境配置:80端口
server:
  port: 80
  servlet:
    context-path: /
  • 若同時(shí)激活dev和prod環(huán)境,則后激活的配置會(huì)覆蓋前面具有相同的配置。
  • 主配置文件依然可以聲明key!不受環(huán)境影響,如果相同,被激活的覆蓋主配置文件。
  • 在主配置文件中激活,屬于靜態(tài)激活。
spring:
  profiles:
    active: dev,prod
  • 運(yùn)行項(xiàng)目包的時(shí)候動(dòng)態(tài)激活。
java -jar -Dspring.profiles.active=dev XXXXX.jar 

自定義配置

spring注解讀取配置文件

注意事項(xiàng):

  • Spring框架@PropertySource 默認(rèn)只支持 .properties 文件,不支持 .yaml.yml 文件。
  • 若一定要使用@PropertySource來讀取YAML,則需要我們?nèi)ヅ渲靡粋€(gè)PropertySourceFactory工廠類,實(shí)現(xiàn)YAML解析。
  • 推薦使用SpringBoot中支持yaml文件解析的ConfigurationProperties()注解。
@Data
@Component
@PropertySource(value = "classpath:animal.properties")
public class Animal {
    @Value("${animal.dog.name}")
    private String name;
    @Value("${animal.dog.age}")
    private Integer age;
    @Value("${animal.dog.color}")
    private String color;
    @Value("${animal.dog.type}")
    private String type;
}
  • animal.properties配置文件:
animal.dog.name=small yellow
animal.dog.age=18
animal.dog.color=black
animal.dog.type=中華田園犬

SpringBoot注解批量讀取配置文件

Spring Boot 允許將配置文件中的屬性綁定到Java對(duì)象上,通常使用@ConfigurationProperties注解。

@ConfigurationProperties批量的配置參數(shù)讀?。?/strong>

  • 最后一層和屬性名相同,則自動(dòng)映射。
  • 配置文件中的key與對(duì)象屬性要一一對(duì)應(yīng)。
  • 類上的配置注解:@ConfigurationProperties(prefix = "animal.dog")前綴要精確
  • 屬性和Key多寫或者少寫都沒有關(guān)系,沒有則被賦值為null。

application.yaml配置文件:

animal:
  dog:
    name: 狗
    age: 18
    color: 黑
    type: 土狗

配置類:

@Data
@ConfigurationProperties(prefix = "animal.dog")  
public class Dog {
    private String name;
    private Integer age;
    private String color;
    private String type;
}
  • 該代碼會(huì)報(bào)錯(cuò),因?yàn)槿鄙僮?cè)機(jī)制,Spring 找不到它
解決方案

方案1:使用 @EnableConfigurationProperties(推薦)

  • 在主應(yīng)用類或配置類上添加 @EnableConfigurationProperties
@SpringBootApplication
@EnableConfigurationProperties(value = {Dog.class}) // 明確注冊(cè) Dog 類
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

方案2:添加 @Component 注解

  • Dog 類上添加 @Component 注解,讓 Spring 自動(dòng)掃描:
@Data
@Component  // 添加組件注解
@ConfigurationProperties(prefix = "animal.dog")
public class Dog {
    private String name;
    private Integer age;
    private String color;
    private String type;
}

方案3:使用 @ConfigurationPropertiesScan

在主應(yīng)用類上添加 @ConfigurationPropertiesScan

@SpringBootApplication
@ConfigurationPropertiesScan  // 掃描所有 @ConfigurationProperties 類
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
// 或者指定掃描包
@SpringBootApplication
@ConfigurationPropertiesScan("com.example.config")  // 指定包路徑
public class Application {
    // ...
}

方案4:在配置類中注冊(cè)

  • 創(chuàng)建一個(gè)配置類來注冊(cè)配置屬性:
@Configuration
public class AppConfig {
    @Bean
    @ConfigurationProperties(prefix = "animal.dog")
    public Dog dog() {
        return new Dog();
    }
}

SpringBoot測試環(huán)境

SpringBoot的測試注解@SpringBootTest,會(huì)自動(dòng)讀取啟動(dòng)類。

  • 測試類應(yīng)該在啟動(dòng)類所在的包或者子包
  • 測試類不在啟動(dòng)類相同包或子包。
  • 自己通過注解指定啟動(dòng)類!@SpringBootTest(classes = XXXXApplication.class)

導(dǎo)入test場景啟動(dòng)器:

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
 </dependency>

方式一:測試類在啟動(dòng)類所在包

  • 項(xiàng)目啟動(dòng)器類包路徑:src/main/java/com/animal/AnimalApplication.java
  • 測試類包路徑: src/test/java/com/animal/AnimalApplicationTests.java
  • 測試類與啟動(dòng)器類相同路徑:/java/com/animal/
package com.animal;
@SpringBootTest
class AnimalApplicationTests {
    @Autowired
    Animal animal;
    @Test
    void contextLoads() {
        System.out.println("animal = " + animal);
    }
}

方式二:測試類通過注解指定啟動(dòng)類

  • 項(xiàng)目啟動(dòng)器類包路徑:src/main/java/com/animal/AnimalApplication.java
  • 測試類包路徑: src/test/java/TestDemo.java
  • 測試類不在啟動(dòng)器類所在包或子包下。
  • 通過注解指定啟動(dòng)器類,來啟動(dòng)測試環(huán)境。
@SpringBootTest(classes = AnimalApplication.class)
public class TestDemo {
    @Autowired
    Animal animal;
    @Test
    void test(){
        System.out.println("animal = " + animal);
    }
}

其他擴(kuò)展

項(xiàng)目父依賴spring-boot-starter-parent必須要引用嗎?不引用可以使用SpringBoot項(xiàng)目嗎?

直接答案:不是必須的!

專業(yè)定義spring-boot-starter-parent是一個(gè)Maven父POM(Project Object Model),它提供了Spring Boot項(xiàng)目的默認(rèn)配置依賴管理插件配置。使用它是可選的,但強(qiáng)烈推薦。

Spring Boot 給了我們選擇的自由。你可以:

1. 選擇:spring-boot-starter-parent- 省心省力

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.6</version>
    </parent>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cat.ssm</groupId>
    <artifactId>cat-ssm</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.6</version>
    </parent>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

spring-boot-starter-parent專業(yè)特性

  • 依賴管理(Dependency Management):統(tǒng)一管理所有Spring Boot相關(guān)依賴的版本
  • 插件配置(Plugin Configuration):預(yù)配置Maven插件,如spring-boot-maven-plugin
  • 資源過濾(Resource Filtering):自動(dòng)處理配置文件中的占位符替換
  • 屬性配置(Property Configuration):預(yù)定義Java版本、編碼等構(gòu)建屬性

spring-boot-starter-parent優(yōu)勢:

  • ? 開箱即用:不用操心版本兼容
  • ? 配置齊全:插件、編碼、Java版本都配好了
  • ? 社區(qū)標(biāo)準(zhǔn):遵循Spring Boot官方最佳實(shí)踐
  • ? 減少錯(cuò)誤:避免手動(dòng)配置出錯(cuò)

2. 選擇:依賴管理導(dǎo)入 - 自由設(shè)計(jì),個(gè)性定制

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.dependencies}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • 父項(xiàng)目POM文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sb.ssm</groupId>
    <artifactId>spring-boot-framework</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.boot.dependencies>3.5.6</spring.boot.dependencies>
    </properties>
    <!--依賴管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.dependencies}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring.boot.dependencies}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--子項(xiàng)目-->
    <modules>
        <module>cat-ssm</module>
    </modules>
    <!-- 構(gòu)建配置 -->
    <build>
        <plugins>
            <!-- 必須手動(dòng)配置所有插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  • 子項(xiàng)目POM文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cat.ssm</groupId>
    <artifactId>cat-ssm</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>com.sb.ssm</groupId>
        <artifactId>spring-boot-framework</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

專業(yè)特性

  • BOM導(dǎo)入(Bill of Materials):通過spring-boot-dependencies導(dǎo)入依賴版本管理
  • 插件管理(Plugin Management):手動(dòng)配置所有需要的Maven插件
  • 自定義屬性:完全控制構(gòu)建環(huán)境和配置參數(shù)

dependencies的優(yōu)勢:

  • ? 完全控制:自己決定所有配置
  • ? 已有項(xiàng)目集成:已有父項(xiàng)目的可以無縫接入
  • ? 企業(yè)規(guī)范:符合公司內(nèi)部的Maven規(guī)范
  • ? 靈活定制:可以混合其他技術(shù)棧

對(duì)于大多數(shù) Spring Boot 項(xiàng)目,繼承 spring-boot-starter-parent 是最簡單、最安全的選擇。

  • 只有在有特殊需求或企業(yè)規(guī)范約束時(shí),才考慮使用依賴管理導(dǎo)入的方式。

認(rèn)識(shí)SpringBootApplication啟動(dòng)器類

@SpringBootApplication 注解中,這三個(gè)注解的組合使得 Spring Boot 應(yīng)用能夠:

  1. 通過 @SpringBootConfiguration 標(biāo)記主配置類,定義 bean。標(biāo)記類為配置類,是 @Configuration 的特殊形式。
  2. 通過 @ComponentScan 掃描組件,注冊(cè) bean。
  3. 通過 @EnableAutoConfiguration 根據(jù)條件自動(dòng)配置 bean。啟用自動(dòng)配置,根據(jù) classpath 和已有配置自動(dòng)配置 Spring 應(yīng)用。

它們的執(zhí)行順序大致為:

  1. 首先,@ComponentScan 掃描并注冊(cè)當(dāng)前包及其子包下的組件。
  2. 然后,@EnableAutoConfiguration 根據(jù)條件自動(dòng)配置其他 bean。

這種協(xié)同工作使得 Spring Boot 應(yīng)用能夠快速啟動(dòng)并運(yùn)行,同時(shí)提供了極大的靈活性。

@SpringBootApplication啟動(dòng)器注解說明

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

}
@SpringBootConfiguration注解

詳細(xì)解釋:
@SpringBootConfiguration 是一個(gè)類級(jí)別的注解,它表明該類是一個(gè)配置類,并且是 Spring Boot 應(yīng)用的配置類。

  • 實(shí)際上,它是對(duì) @Configuration 注解的封裝,兩者在功能上是一樣的。
  • 但是,@SpringBootConfiguration 被設(shè)計(jì)為 Spring Boot 應(yīng)用的主配置類,通常與 @EnableAutoConfiguration@ComponentScan 結(jié)合使用,形成 @SpringBootApplication 注解。

關(guān)鍵點(diǎn):

  • 它是一個(gè)特化的 @Configuration,用于 Spring Boot 應(yīng)用。
  • 它允許 Spring 容器通過調(diào)用同一配置類中的 @Bean 方法來管理 bean 的依賴關(guān)系,因?yàn)槟J(rèn)情況下(proxyBeanMethods = true)會(huì)使用 CGLIB 代理來攔截對(duì) @Bean 方法的調(diào)用,確保返回的是 Spring 容器中管理的單例 bean。
  • 在大多數(shù)情況下,一個(gè) Spring Boot 應(yīng)用只有一個(gè)類被標(biāo)注為 @SpringBootConfiguration,通常就是主啟動(dòng)類。

示例代碼:

@SpringBootConfiguration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
    @Bean
    public MyRepository myRepository() {
        return new MyRepositoryImpl();
    }
}
@EnableAutoConfiguration

詳細(xì)解釋:
@EnableAutoConfiguration 是 Spring Boot 自動(dòng)配置的核心注解。它通過 @Import 導(dǎo)入了 AutoConfigurationImportSelector,這個(gè)類會(huì)利用 Spring 的 SpringFactoriesLoader 機(jī)制從 classpath 下的 META-INF/spring.factories 文件中讀取所有配置的自動(dòng)配置類,然后根據(jù)條件注解(如 @ConditionalOnClass@ConditionalOnBean 等)來決定是否啟用這些自動(dòng)配置類。

關(guān)鍵點(diǎn):

  • 自動(dòng)配置類通常是一個(gè) @Configuration 類,但是它們只有在滿足特定條件時(shí)才會(huì)被加載。
  • 自動(dòng)配置的順序可以通過 @AutoConfigureOrder、@AutoConfigureBefore、@AutoConfigureAfter 來調(diào)整。
  • 我們可以通過 excludeexcludeName 屬性來排除不需要的自動(dòng)配置類,也可以通過配置屬性 spring.autoconfigure.exclude 來排除。

自動(dòng)配置過程:

  1. 收集自動(dòng)配置類AutoConfigurationImportSelector 使用 SpringFactoriesLoaderMETA-INF/spring.factories 中加載 EnableAutoConfiguration 對(duì)應(yīng)的配置類列表。
  2. 過濾自動(dòng)配置類:通過條件注解(如 @ConditionalOnClass、@ConditionalOnBean 等)過濾掉不滿足條件的配置類。
  3. 應(yīng)用自動(dòng)配置:將過濾后的自動(dòng)配置類加載到 Spring 容器中。

示例說明

假設(shè)我們有一個(gè)自動(dòng)配置類用于配置數(shù)據(jù)源:

@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.url")
//自動(dòng)配置排序
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
public class DataSourceAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().build();
    }
}

這個(gè)自動(dòng)配置類只有在 classpath 下存在 DataSource 類并且配置了 spring.datasource.url 屬性時(shí)才會(huì)生效,而且只有在容器中沒有 DataSource bean 時(shí)才會(huì)創(chuàng)建。

@ComponentScan注解

詳細(xì)解釋:
@ComponentScan 注解用于告訴 Spring 掃描指定包(及其子包)下的組件,包括 @Component@Service、@Repository、@Controller 等注解標(biāo)記的類,并將它們注冊(cè)為 Spring bean。如果沒有指定包,則默認(rèn)掃描注解所在類的包及其子包。

關(guān)鍵點(diǎn):

  • 通過 basePackagesbasePackageClasses 屬性指定要掃描的包。
  • 可以使用 includeFiltersexcludeFilters 進(jìn)行更細(xì)粒度的控制。
  • 在 Spring Boot 中,通常主啟動(dòng)類上使用了 @SpringBootApplication,它包含了 @ComponentScan,默認(rèn)掃描主啟動(dòng)類所在包及其子包。

掃描過程:

  1. 掃描指定包:根據(jù) basePackagesbasePackageClasses 確定的包路徑,掃描類文件。
  2. 識(shí)別組件:通過檢查類上的注解(如 @Component、@Service 等)來識(shí)別組件。
  3. 注冊(cè) Bean 定義:將識(shí)別到的組件注冊(cè)到 Spring 容器的 Bean 定義中。

示例說明:

@ComponentScan(basePackages = "com.example.app", 
               excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Controller.class))
public class AppConfig {
}

這個(gè)配置類會(huì)掃描 com.example.app 包及其子包下除了被 @Controller 注解的類之外的所有組件。

到此這篇關(guān)于Spring Boot場景啟動(dòng)器(Starters)完全指南:從入門到精通的文章就介紹到這了,更多相關(guān)Spring Boot場景啟動(dòng)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaWeb開發(fā)使用Cookie創(chuàng)建-獲取-持久化、自動(dòng)登錄、購物記錄、作用路徑

    JavaWeb開發(fā)使用Cookie創(chuàng)建-獲取-持久化、自動(dòng)登錄、購物記錄、作用路徑

    這篇文章主要介紹了JavaWeb開發(fā)使用Cookie創(chuàng)建-獲取-持久化、自動(dòng)登錄、購物記錄、作用路徑的相關(guān)知識(shí),非常不錯(cuò),對(duì)cookie持久化知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-08-08
  • @RefreshScope(nacos配置熱更新方式)

    @RefreshScope(nacos配置熱更新方式)

    文章主要介紹了Spring和Nacos對(duì)`@RefreshScope`注解的處理方式,Spring在每次調(diào)用被`@RefreshScope`注解的bean的屬性時(shí),會(huì)先從本地緩存獲取,如果緩存不存在則重新創(chuàng)建并獲取最新環(huán)境配置
    2024-12-12
  • Java Caffeine 高性能緩存庫詳解與使用案例詳解

    Java Caffeine 高性能緩存庫詳解與使用案例詳解

    Caffeine是Java生態(tài)中最先進(jìn)的本地緩存庫,其 高性能、低延遲 的設(shè)計(jì)使其成為現(xiàn)代應(yīng)用的首選,通過靈活的配置和強(qiáng)大的統(tǒng)計(jì)功能,開發(fā)者可以輕松實(shí)現(xiàn)高效的緩存策略,顯著提升系統(tǒng)性能,本文介紹Java Caffeine高性能緩存庫詳解與使用案例,感興趣的朋友一起看看吧
    2025-10-10
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(17)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(17)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • java使用Swagger文檔報(bào)錯(cuò)“java.lang.NullPointerException:null”

    java使用Swagger文檔報(bào)錯(cuò)“java.lang.NullPointerException:null”

    文章描述了一個(gè)Java項(xiàng)目中使用Swagger文檔時(shí)遇到的問題,每次啟動(dòng)都報(bào)錯(cuò),但不影響項(xiàng)目運(yùn)行,問題原因可能是實(shí)體類中@ApiModelProperty有相同的name值或修飾符誤寫,最終通過重寫源碼代碼進(jìn)行判空處理解決了問題,此經(jīng)驗(yàn)僅供參考
    2026-05-05
  • Springboot配置全局跨域未生效,訪問接口報(bào)錯(cuò)問題及解決

    Springboot配置全局跨域未生效,訪問接口報(bào)錯(cuò)問題及解決

    這篇文章主要介紹了Springboot配置全局跨域未生效,訪問接口報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • java之minio文件服務(wù)器的日常操作

    java之minio文件服務(wù)器的日常操作

    本文介紹如何在Java項(xiàng)目中配置Minio服務(wù),通過創(chuàng)建minioConfig和minioDto來管理連接信息,并通過minioUtils工具類實(shí)現(xiàn)文件的上傳、下載和刪除功能,詳細(xì)說明了如何從application.yml文件中讀取配置,并強(qiáng)調(diào)了避免static情況下minioDto為null的問題,另外,提到刪除操作是延遲的
    2024-10-10
  • java實(shí)現(xiàn)坦克大戰(zhàn)小游戲

    java實(shí)現(xiàn)坦克大戰(zhàn)小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)坦克大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • spring利用squertz實(shí)現(xiàn)定時(shí)任務(wù)

    spring利用squertz實(shí)現(xiàn)定時(shí)任務(wù)

    spring squertz是一個(gè)強(qiáng)大的定時(shí)任務(wù)處理方式。下面這篇文章主要介紹了spring利用squertz實(shí)現(xiàn)定時(shí)任務(wù)的相關(guān)資料,文中介紹的很詳細(xì),對(duì)大家具有一定的參考借鑒價(jià)值,需要的朋友們下面來一起看看吧。
    2017-01-01
  • maven之packaging標(biāo)簽的使用

    maven之packaging標(biāo)簽的使用

    這篇文章主要介紹了maven之packaging標(biāo)簽的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論

通城县| 洛隆县| 江津市| 罗城| 华坪县| 慈利县| 象山县| 南平市| 永修县| 郧西县| 遂平县| 嘉祥县| 长春市| 平陆县| 龙泉市| 彩票| 宜城市| 博白县| 阳春市| 竹山县| 理塘县| 信宜市| 成武县| 霍城县| 多伦县| 阳信县| 慈溪市| 丹东市| 齐齐哈尔市| 封丘县| 南汇区| 通渭县| 南岸区| 施秉县| 天气| 恩平市| 浠水县| 潞城市| 彭水| 宁强县| 永和县|