SpringCloud Alibaba微服務番外一 - Swagger自定義自動配置



點擊箭頭處java

「JAVA日知錄」mysql

,關注並星標喲!!web


概述

咱們的全部微服務若想集成Swagger在線接口文檔,都須要在各自模塊中創建一個Swagger的配置類,關鍵代碼以下:spring

@Configuration
@EnableSwagger2
public class SwaggerConfig {
private static final String VERSION = "1.0.0";
/**
* 建立API
*/

@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.enable(true)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
.paths(PathSelectors.any())
.build();
}

/**
* 添加摘要信息
*/

private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("product-server接口文檔")
.contact(new Contact("JAVA日知錄","http://javadaily.cn","jianzh5@163.com"))
.description("product-server接口文檔")
.version(VERSION)
.build();
}
}

這樣每一個模塊中都有一個SwaggerConfig配置類,他們的邏輯基本都同樣,只是一些摘要信息不同。這明顯也算是違反了 DRY(Don't Repeat Yourself) 原則,此次咱們來優化優化它,經過修改配置文件讓Swagger自動配置。sql

不過在編寫代碼以前咱們仍是須要先了解一下SpringBoot的自動配置原理。數據庫

SpringBoot自動配置原理

SpringBoot項目啓動類上都會添加@SpringBootApplication 註解,這個註解是個組合註解,他的核心功能是開啓自動配置註解@EnableAutoConfiguration,以下圖所示:api

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
。。。
}

@EnableAutoConfiguration 又經過@Import 註解導入了AutoConfigurationImportSelector。經過對AutoConfigurationImportSelectorselectImports 方法的跟蹤,咱們找到SpringBoot啓動時會經過SpringFactoriesLoader.loadFactoryNames 方法 從 META-INF/spring.factories 這個文件下去尋找有沒有自動配置類。微信

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}

spring.factories

在項目中打開spring-boot-autoconfigure-2.1.9.RELEASE.jar,而後在META-INF文件夾下打開spring.factories,截取部份內容以下:app

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

這個文件是一組的key=value的形式,經過value找到了自定義配置類,這裏選取一個咱們比較常見的配置類org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,打開源碼:編輯器

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class})
public class DataSourceAutoConfiguration {
...
}

這裏咱們又發現配置類上使用了@EnableConfigurationProperties({DataSourceProperties.class}),這個註解是去加載配置類。

application.properties

再打開DataSourceProperties.class,代碼以下:

@ConfigurationProperties(
prefix = "spring.datasource"
)
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
private ClassLoader classLoader;
private String name;
private boolean generateUniqueName;
private Class<? extends DataSource> type;
private String driverClassName;
private String url;
private String username;
private String password;
...
}

看到這裏你們都應該很熟悉了,主要是經過註解 @ConfigurationProperties 從配置文件中加載spring.datasource開頭的配置,如咱們常常用的數據庫配置

spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://xxxxxxx/cloud_alibaba?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
username: xxx
password: xxxxxx
driver-class-name: com.mysql.jdbc.Driver

從配置文件獲取相關配置注入到DataSourceProperties這個類中

總結

經過觀察源碼咱們找到了SpringBoot自定義配置類的加載過程,主要是從META-INF/spring.factories 找到對應的啓動類,啓動類上再經過配置類加載配置文件。提及來很簡單,可是實現起來仍是很複雜的。接下來咱們就根據咱們的理解來完成Swagger的自動配置。

自定義Swagger自動配置

這裏可能有人會問,雖然看完了自定義配置的加載邏輯,可是仍是不會寫怎麼辦?
不會寫不要緊啊,我們不是會複製粘貼嗎?

咱們以org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration爲例,開始咱們的自定義配置(Copy,Paste)過程

創建配置文件

咱們在common模塊創建resources/META-INF/spring.factories 文件,粘貼上面的配置進行修改

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.javadaily.autoconfigure.SwaggerAutoConfiguration

創建配置類,從配置文件讀取配置

先想一想咱們須要哪些配置,一個title,一個description,還有一個enable用來控制是否開放在線測試,分析清楚了咱們就創建對應的配置類SwaggerProperties

@Data
@ConfigurationProperties(prefix = "javadaily.swagger")
public class SwaggerProperties {
/**
* 是否啓用swagger,生產環境建議關閉
*/

private boolean enabled;
/**
* 文檔標題
*/

private String title;
/**
* 文檔描述
*/

private String description;
}

創建自定義配置類

核心代碼,可是實現起來比較簡單。
拷貝原來的配置類內容,加上相關注解,注入配置類,將原來寫死的地方改爲從配置類獲取便可。

@Slf4j
@Configuration
//注入配置類
@EnableConfigurationProperties({SwaggerProperties.class})
//根據配置文件決定是否自動配置
@ConditionalOnProperty(prefix = "javadaily.swagger", name = "enabled", havingValue = "true")
@Import({Swagger2DocumentationConfiguration.class})
public class SwaggerConfig {
private static final String VERSION = "1.0.0";
private SwaggerProperties swaggerProperties;
public SwaggerAutoConfiguration (SwaggerProperties swaggerProperties){
this.swaggerProperties = swaggerProperties;
}
/**
* 建立API
*/

@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.enable(true)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
.paths(PathSelectors.any())
.build();
}

/**
* 添加摘要信息
*/

private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.contact(new Contact("JAVA日知錄","http://javadaily.cn","jianzh5@163.com"))
.title(swaggerProperties.getTitle())
.description(swaggerProperties.getDescription())
.version(VERSION)
.build();
}
}

在微服務層的配置文件上加入swagger相關的配置

## swagger自定義配置屬性
javadaily:
swagger:
enabled: true
title: account-service在線接口平臺
description: account-service微服務相關接口

注意:這裏配置文件須要以javadaily.swagger前綴開始,跟上面的配置類相對應

通過以上四步咱們完成了Swagger的自定義自動配置,接下來就是在服務層引入common模塊,而後刪除掉SwaggerConfig類,讓common模塊給咱們自動配置。

是否是很簡單呢,大家也來試試吧!


好了,各位朋友們,本期的內容到此就所有結束啦,能看到這裏的同窗都是優秀的同窗,下一個升職加薪的就是你了!
若是以爲這篇文章對你有所幫助的話請掃描下面二維碼加個關注。"
轉發 " 加 " 在看 ",養成好習慣!我們下期再見!
 

熱文推薦

☞ 數據庫優化之SQL優化
☞ 數據庫優化之實例優化
☞ Docker基礎與實戰,看這一篇就夠了!
☞ Docker-Compose基礎與實戰,看這一篇就夠了!
 OAuth2.0最簡嚮導(多圖預警)
 構建三維一體立體化監控體系



JAVA日知錄

長按左邊二維碼關注咱們,精彩文章第一時間推送


戳我留言


朕已閱 


本文分享自微信公衆號 - JAVA日知錄(javadaily)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索