點擊箭頭處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
。經過對AutoConfigurationImportSelector
中 selectImports
方法的跟蹤,咱們找到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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。