前言
基于springboot框架开发越来越流行,开发过程中自动配置和各类starter必不可少,如果自定义配置类多个模块都需要使用,就需要拷贝多份代码,不利于后续配置代码的维护。解决方案是将配置类进行封装,多个模块以jar包形式引入,后续只需要对配置封装类进修改,自定义starter就是个很好的方式
项目结构
官方提供的starter,大多包含两个jar包: 一个starter——没有任何实现,只用来管理依赖(即实现这个starter的功能需要依赖哪些jar),一个autoconfigure——包含所有具体实现,包括自动配置类,及META-INF/spring.factories文件,本文示例自定义starter将两者进行了合并
![]()
springboot-starter
1、引入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
|
2、配置属性类
1 2 3 4 5 6 7 8 9
| @Data @ConfigurationProperties(prefix = "swagger") public class SwaggerProperties { private String title = "服务端接口文档"; private String version = "1.0"; private String tokenHeader = "token"; private Boolean enabled = false; private String[] basePackages; }
|
3、配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| @Configuration @ConditionalOnMissingBean(Docket.class) @ConditionalOnClass(EnableSwagger2.class) @EnableSwagger2 @EnableConfigurationProperties(SwaggerProperties.class) public class SwaggerAutoConfig {
@Autowired private SwaggerProperties swaggerProperties;
private ApiInfo apiInfo() { return new ApiInfoBuilder() .title(swaggerProperties.getTitle()) .version(swaggerProperties.getVersion()) .build(); }
@Bean public Docket docket() { ParameterBuilder ticketPar = new ParameterBuilder(); List<Parameter> pars = new ArrayList<>(); ticketPar .name(swaggerProperties.getTokenHeader()).description("token") .modelRef(new ModelRef("string")) .parameterType("header") .defaultValue("Bearer ") .required(true) .build(); pars.add(ticketPar.build());
Predicate<RequestHandler> or = null; String[] basePackages = swaggerProperties.getBasePackages(); if (basePackages != null && basePackages.length > 0) { Predicate<RequestHandler>[] predicates = new Predicate[basePackages.length]; for (int i = 0; i < predicates.length; i++) { predicates[i] = RequestHandlerSelectors.basePackage(basePackages[i]); } or = Predicates.or(predicates); }
ApiSelectorBuilder builder = new Docket(DocumentationType.SWAGGER_2) .enable(swaggerProperties.getEnabled()) .apiInfo(apiInfo()) .select() .paths(Predicates.not(PathSelectors.regex("/error.*"))); if (or != null) { builder.apis(or); } return builder.build().globalOperationParameters(pars); } }
|
spring.factories(指定配置类全类名)
1
| org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.powersi.swagger2.SwaggerAutoConfig
|
starter使用
1、pom.xml引入依赖
1 2 3 4 5
| <dependency> <groupId>com.powersi</groupId> <artifactId>swagger2-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
|
2、application.yml配置
1 2 3 4 5 6 7
| swagger: enabled: true version: 1.0 token-header: token base-packages: com.powersi.kbs.controller
|