[Spring Boot] 自定义 Spring Boot Starter

简介


在了解了Spring Boot的自动装配原理后,我们来实现一个Spring Boot常见的Starter项目

手机用户请横屏获取最佳阅读体验,REFERENCES中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。

平台 地址
CSDN https://blog.csdn.net/sinat_28690417
简书 https://www.jianshu.com/u/3032cc862300
个人博客 https://yiyuery.github.io/NoteBooks/

正文

准备工作

依赖和环境

  • org.springframework.boot:spring-boot-starter:2.1.0-RELEASE
  • gradle 4.1

项目结构

[Spring Boot]自定义Spring Boot Starter_java教程

summer-boot-hello-starter 定义

申明自动装配配置类

首先,需要定义自动装配的配置,我们期望可以将starteryml中配置的一些字段绑定起来,在引入对应starter后,会读取配置并完成对应Spring实例的自动装配

自动装配配置类

@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(HelloSummerBootService.class)
@ConditionalOnProperty(prefix = "summer.boot.hello",value="enabled",matchIfMissing = true)
@Slf4j
public class HelloAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(HelloSummerBootService.class)
    public HelloSummerBootService helloWorldService(HelloProperties helloProperties){
        log.info("HelloAutoConfiguration >> register HelloSummerBootService has started!");
        return HelloSummerBootService.builder().name(helloProperties.getName()).message(helloProperties.getMessage()).build();
    }
}
  • @Configuration 申明为Spring的配置类
  • @ConditionalOnMissingBean 当实例不存在时自动创建配置
  • @ConditionalOnClass 当类可以加载到时创建配置
  • @ConditionalOnProperty 当配置的属性存在时创建配置

yml配置加载类

@ConfigurationProperties(prefix="summer.boot.hello")
@Component
@Getter
@Setter
public class HelloProperties {

    private String name;

    private String message;

}
  • @ConfigurationProperties 加载前缀为 prefix 对应值的yml中的属性

Spring实例申明

@Getter
@Setter
@AllArgsConstructor
@Builder
@NoArgsConstructor
public class HelloSummerBootService {

    private String name;

    private String message;

    /**
     * hello方法输出配置内容
     *
     * @return
     */
    public String hello() {
        return name + "," + message + " > HelloSummerBootService!";
    }

}

自动装配类申明

summer-boot-autoconfigure/src/main/resources/META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.summer.boot.autoconfigure.hello.HelloAutoConfiguration

项目依赖

此处由于申明了父级module的依赖,用于公共依赖,如果是简单项目,直接引用org.springframework.boot:spring-boot-starter:2.1.0-REALEASE即可

//summer-boot-autoconfigure
dependencies {
    compile project(":summer-boot:summer-boot-project:summer-boot-parent")
}

//summer-boot-parent
dependencies {
    compile libs["spring-boot-starter"] //对应org.springframework.boot:spring-boot-starter:2.1.0-REALEASE
}

Starter 定义申明

[Spring Boot]自定义Spring Boot Starter_java开发_02

dependencies {
    //引入starter父级module
    compile project(":summer-boot:summer-boot-project:summer-boot-starters:summer-boot-starter")
    compile libs["spring-boot-starter-web"]
}
//starter父级module,引入前面实现的自动装配配置module
dependencies {
    compile project(":summer-boot:summer-boot-project:summer-boot-autoconfigure")
}

编写测试项目

由于前文引入了spring-boot-starter-web,我们直接编写个简单的Demo Web工程进行测试

[Spring Boot]自定义Spring Boot Starter_java教程_03

WEB 接口定义

@RestController
public class HelloController {

    //注入自动装配的实现类
    @Resource
    HelloSummerBootService helloSummerBootService;

    @GetMapping("hello")
    public String hello(){
        return helloSummerBootService.hello();
    }
}

项目的依赖就被大大简化了

dependencies {
    compile project(":summer-boot:summer-boot-project:summer-boot-starters:summer-boot-hello-starter")
}

由于我们在autoconfigure项目中针对这个Starter申明了从yml读取配置,我们在yml中补充下配置

summer:
  boot:
    hello:
      name: Ashe
      message: You Have Actived Summer Boot Hello Starter!
      enabled: true
server:
  port: 8081

启动效果

  • 首先,可以看到,自动装配成功了

[Spring Boot]自定义Spring Boot Starter_java_04

  • 接口返回内容

[Spring Boot]自定义Spring Boot Starter_java_05

总结

本文介绍了如何实现一个基于Spring BootStarter,其实原理比较简单,用到的就是Spring Boot的自动装配能力,不清楚的小伙伴可以看前几期的推文。

大概步骤此处再强调下:

  • 申明autoconfigure项目,并利用条件装配编写配置类
  • 填写spring.factories
  • 如果有yml需要读取定义对应条件装配条件
  • 如果功能希望支持用户扩展,使用 @Bean + @ConditionalOnMissingBean(XXService.class)可以在用户没定义实现类的情况下提供Starter默认的实现类。

拓展

能做什么?

  • 基于项目模块化的工具定义Starter,可以实现快速提供支持,避免重复开发
  • 比如之前提到的Swagger,完全可以根据业务需求,实现一个自动化装配的实现类,通过yml去定义扫描的位置和需要进行的接口分组,其余的直接自动实现装配和扫描(目前已经有人实现了,后续推文小编也会实现一些工具的自动装配Starter)

更多

扫码关注架构探险之道,回复『源码』,获取本文相关源码和资源链接

[Spring Boot]自定义Spring Boot Starter_java_06

知识星球(扫码加入获取历史源码和文章资源链接)

[Spring Boot]自定义Spring Boot Starter_java_07