springboot 动态注册swagger docket配置
背景
最近发现swagger文档接口越来越多,加载好像有点慢。想到swagger分组功能,想搞下,但是一想到需要写死docket的bean注册,这不服务有许多子应用设计,需要动态注册docket bean。
一、swagger配置
基于配置类向spring容器动态添加bean方式,就有下面的代码
StarterConfiguration配置类,当useGroup设置为true时候读取分组值,默认读取basePackage
package com.test.starter.swagger;
import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import com.test.starter.swagger.SwaggerProperties.GroupRefBasePackage;
import lombok.extern.slf4j.Slf4j;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import springfox.documentation.PathProvider;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* swagger Dcoket配置
*/
@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI
@Slf4j
public class StarterConfiguration {
@Autowired
private ConfigurableEnvironment environment;
@Autowired
private ConfigurableApplicationContext applicationContext;
@Autowired
private SwaggerProperties swaggerProperties;
@Bean
public SwaggerProperties swaggerProperties(){
return new SwaggerProperties();
}
@PostConstruct
public void init(){
List<GroupRefBasePackage> groupRefBasePackages = swaggerProperties.getUseGroup()
? swaggerProperties.getGroupRefBasePackages()
: Collections.singletonList(GroupRefBasePackage.of("默认分组", swaggerProperties.getBasePackage()));
for (GroupRefBasePackage groupRefBasePackage:groupRefBasePackages){
this.registerDocket(swaggerProperties, groupRefBasePackage.getGroupName(), groupRefBasePackage.getBasePackage());
}
}
/**
*
* 描述:注册Docket
* @author sakyoka
* @date 2025年3月19日 上午11:21:11
* @param properties
* @param groupName
* @param basePackage
*/
private void registerDocket(SwaggerProperties properties, String groupName, String basePackage) {
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.groupName(groupName)
.apiInfo(new ApiInfoBuilder()
.title(properties.getTitle())
.description(properties.getDescription())
.version(properties.getVersion())
.termsOfServiceUrl(properties.getTermsOfServiceUrl())
.build())
.select()
.apis(RequestHandlerSelectors.basePackage(basePackage))
.paths(PathSelectors.any())
.build();
String beanName = Objects.isNull(groupName) ? "swaggerDocket" : basePackage + "SwaggerDocket";
log.debug("registerDocket =》 docket beanName:{},groupName:{},basePackage:{}", beanName, groupName, basePackage);
applicationContext.getBeanFactory().registerSingleton(beanName, docket);
}
}
SwaggerProperties配置类
package com.test.starter.swagger;
import lombok.Data;
import java.util.Collections;
import java.util.List;
import javax.validation.constraints.NotBlank;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Swagger 配置属性
*/
@Data
@ConfigurationProperties("swagger")
public class SwaggerProperties {
/**
* Swagger 文档标题
*/
private String title = "swagger 接口文档";
/**
* Swagger 描述
*/
private String description = "swagger-bootstrap-ui";
/**
* 版本号
*/
private String version = "1.0.0";
/**
* 服务地址
*/
private String termsOfServiceUrl = "http://localhost:8080/";
/**
* 扫描包地址
*/
private String basePackage = "com.test";
/**
* 是否使用接口分组
*/
private Boolean useGroup = false;
/**
* 分组配置
*/
private List<GroupRefBasePackage> groupRefBasePackages = Collections.emptyList();
/**
*
* 描述:swagger分组
* @author sakyoka
* @date 2025年3月19日 上午11:02:40
*/
@Data
public static class GroupRefBasePackage {
/**数据源*/
@NotBlank
private String groupName;
/**包目录*/
@NotBlank
private String basePackage;
/**
*
* 描述:创建
* @author sakyoka
* @date 2025年3月19日 下午2:25:47
* @param groupName
* @param basePackage
* @return GroupRefBasePackage
*/
public static GroupRefBasePackage of(String groupName, String basePackage) {
GroupRefBasePackage groupRefBasePackage = new GroupRefBasePackage();
groupRefBasePackage.setGroupName(groupName);
groupRefBasePackage.setBasePackage(basePackage);
return groupRefBasePackage;
}
}
}
二、yml配置
swagger:
title: 测试接口文档
basePackage: com.test#开启分组
useGroup: true
groupRefBasePackages:
- groupName: 1、测试接口文档1
basePackage: com.test.api1
- groupName: 2、测试接口文档2
basePackage: com.test.api2