手写一个SpringBoot Starter

定义

所谓的 Starter ,就是Springboot中的某一个模块,它把这一一模块的所需要的JAR包打包好给我们并且能报配置文件文件搞好,不需要我们手机配置了,其实就是一个普通的 Maven 项目 。

开整

首先建立一个Maven项目, 创建完成后,添加 Starter 的自动化配置类即可

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-autoconfigure</artifactId>
       <version>2.1.4.RELEASE</version>
  </dependency>

配置完成后,我们首先创建一个 MyProperties 类,用来接受 application.properties 中注入的值 代码如下

@Component
@ConfigurationProperties(prefix ="javaboy")
public class MyProperties {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

这个配置类很好理解,将 application.properties 中配置的属性值直接注入到这个实例中, @ConfigurationProperties 类型安全的属性注入,即将 application.properties 文件中前缀为 javaboy 的属性注入到这个类对应的属性上, @Component表示将此类标记为Spring容器中的一个Bean。 最后使用时候,application.properties 中的配置文件(使用yml配置也是可以的,就是写法格式不一样),大概如下:

javaboy.name=zhangsan
javaboy.age=12

接下来我们来定义一个 MyService ,然后定义一个简单的myMethod方法,MyService 的定义如下:

public class MyService {
    private String name;
    private int age;

    public String myMethod(){
        return name+"今年"+age+"岁了!";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

最后也是最重要的一步就是定义我们的自动配置类,先看代码,后面讲解

@Configuration
@EnableConfigurationProperties(MyProperties.class)
@ConditionalOnClass(MyService.class)
public class MyServiceAutoConfiguration {
    @Autowired
    MyProperties myProperties;

    @Bean
    MyService myService() {
        MyService myService = new MyService();
        myService.setName(myProperties.getName());
        myService.setAge(myProperties.getAge());
        return myService;
    }
}

代码解释如下:

  • 首先 @Configuration 注解表明这是一个配置类。
  • @EnableConfigurationProperties 注解是使我们之前配置的 @ConfigurationProperties 生效,让配置的属性成功的进入 Bean 中。
  • @ConditionalOnClass 表示当项目当前 classpath 下存在 MyService时,后面的配置才生效。
  • 自动配置类中首先注入 MyProperties,这个实例中含有我们在 application.properties 中配置的相关数据。
  • 提供一个 myService的实例,将 MyProperties中的值注入进去。

做完这一步之后,我们的自动化配置类就算是完成了,接下来还需要一个 spring.factories 文件(这个文件干什么用的在我这篇文章中有讲过:传送门),这里就不解释了,我们继续往下走。

我们首先在 Maven 项目的 resources 目录下创建一个名为 META-INF 的文件夹,然后在文件夹中创建一个名为 spring.factories 的文件,文件内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.wl.mystarter.MyServiceAutoConfiguration

指定我们的自动化配置类的路径即可

现在我们的代码都写好了,将这个自动化配置类打包安装到本地仓库,然后在其他项目中使用即可。安装方式很简单,在 IntelliJ IDEA 中,点击右边的 Maven ,然后选择 Lifecycle 中的 install ,双击即可,如下:

springboot 开发starter springboot starter编写_spring boot

测试

我们来新建一个普通的 Spring Boot 工程,加入我们自定义 Starter 的依赖,如下

<dependency>
           <groupId>org.wl</groupId>
           <artifactId>mystarter</artifactId>
           <version>1.0-SNAPSHOT</version>
    </dependency>

配置application.properties 如下:

javaboy.name=wanglei
javaboy.age=18

单元测试方法中注入 HelloSerivce 实例来测试,代码如下

@SpringBootTest
class SpringbootdemoApplicationTests {

    @Autowired
    MyService myService;
    @Test
    public void contextLoads() {
        System.out.println(myService.myMethod());
    }

}

最后看一下结果

springboot 开发starter springboot starter编写_java_02