手记

Springboot 装配方式 -- 自制 swagger2-boot-starter

Springboot 介绍

平时 SSM 框架开发中,会遇到很多的配置文件,项目中每次集成一个新的框架,都要新增很多框架配置文件。根据“约定高于配置”原则,官方推出“Springboot”对各种框架进行整合,做为开发项目的“脚手架”。

原理

Springboot 对各种框架进行整合,最重要的问题就是装配问题,怎样简单快速的集成一款框架?

集成一款框架最重要的是编写框架的配置文件,Springboot的对配置文件的处理主要有两种方式,分别为自动装配手动装配

自动装配 :编写好框架的配置文件之后, 在 resources/META-INF 目录下编写 spring.factories 文件, 添加属性 org.springframework.boot.autoconfigure.EnableAutoConfiguration=配置文件路径
eg : springboot-boot-autoconfigure 下的自动装配

引用 springboot-boot-{}-starter 之后可以直接使用的框架,采用的是自动装配的方式,

手动装配 :编写好框架的配置文件之后,需要在启动类上使用注解才能对其加载。这样的方式有很多,向我们经常使用的 @EnableTransaction,@EnableCaching,@EnableAsync,@EnableWebMvc 等等,都是用的手动装配方式加载。
eg: @EnableWebMvc

主要是使用 @Import(配置文件.class)

下面就来做一个自制 swagger2 自动装配的 jar 吧

自制 swagger2-boot-starter

首先,创建一个 Springboot 项目,并加载 swagger2 jar 包
pom 文件如下(部分):

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
 <!-- 编译时生成 spring-configuration-metadata.json 文件, 提供跳转-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- springboot 自动装配 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>

        <!-- swagger2 -->
        <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>

自制 swagger2-boot-starter 最重要的两个步骤

  1. 读取 application 配置文件中的 swagger 配置
  2. 自动装配集成 swagger2 的配置文件,并在 spring.factories 中配置

创建 Swagger2AutoConfiguration.java 和 Swagger2Properties.java 分别做这两件事。

读取配置文件

Swagger2Properties 代码如下:

/**
 * 读取 application 配置文件
 *
 * @author hjy
 **/
@Data
@ConfigurationProperties("swagger2")
public class Swagger2Properties {

    /**
     * 分组
     */
    private Map<String, GroupInfo> groups = new LinkedHashMap<>();


    @Data
    public static class GroupInfo {
        /**
         * swagger 会解析的包路径
         */
        private String basePackage;

        /**
         * title
         */
        private String title;

        /**
         * swagger 组相关说明
         */
        private String description;
    }
}

@ConfigurationProperties(“swagger2”): 读取 appliciation 文件中的 swagger2 配置
类的属性为配置的属性

创建框架配置文件

Swagger2AutoConfiguration.java

/**
 * 1. 读取配置文件
 * 2. 将配置文件内容赋值到 swagger 的 Docket 对象
 * 3. 将 Docket 依次注入到 bean 中 (需要实现 BeanFactoryAware 获取beanFatory)
 * 关键是对组的操作
 *
 * @author hjy
 **/
@Configuration
@EnableSwagger2
public class Swagger2AutoConfiguration implements BeanFactoryAware {

    private BeanFactory beanFactory;

    /**
     * 获取 beanFactroy
     * @param beanFactory beanFactory
     * @throws BeansException BeansException
     */
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    @Bean
    public Swagger2Properties properties() {
        return new Swagger2Properties();
    }


    @Bean("createRestOpenApi")
    public List<Docket> createRestOpenApi(Swagger2Properties properties) {
        ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory) beanFactory;
        List<Docket> docketList = new ArrayList<>();
        // swagger 配置
        for (String groupName : properties.getGroups().keySet()) {
            Swagger2Properties.GroupInfo groupInfo = properties.getGroups().get(groupName);
            String basePackage = groupInfo.getBasePackage();
            Docket docket = new Docket(DocumentationType.SWAGGER_2)
                    .groupName(groupName)
                    .apiInfo(openApiInfo(groupInfo))
                    .select()
                    .apis(RequestHandlerSelectors.basePackage(basePackage))
                    .paths(PathSelectors.any())
                    .build();
            docketList.add(docket);
            // docket 加入 IOC 容器
            configurableBeanFactory.registerSingleton(groupName, docket);
        }
        return docketList;
    }


    private ApiInfo openApiInfo(Swagger2Properties.GroupInfo groupInfo) {
        return new ApiInfoBuilder()
                .title(groupInfo.getTitle())
                .description(groupInfo.getDescription())
                .version("1.0")
                .build();
    }

}

主要将 swagger2 的配置加载到 swagger 的 Docket 中,实现 BeanFactoryAware 接口,创建 Docket 的 Bean。

创建自动装配

在 resources/META-INF 文件下创建 spring.factories 文件,写入

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.moming.swagger.autocnfigure.Swagger2AutoConfiguration

指定自动加载的配置文件

Ok, 完成了

源码

0人推荐
随时随地看视频
慕课网APP