美文网首页
只需4步,自己搞个 Spring Boot Starter !

只需4步,自己搞个 Spring Boot Starter !

作者: Java古德 | 来源:发表于2020-08-08 21:50 被阅读0次

    引言

    只要你用Springboot,一定会用到各种spring-boot-starter。其实写一个spring-boot-starter

    ,仅需4步。下面我们就写一个starter,它将实现,在日志中打印方法执行时间。

    第一步 创建maven项目

    在使用spring-boot-starter,会发现,有的项目名称是 XX-spring-boot-starter,有的是

    spring-boot-starter-XX,这个项目的名称有什么讲究呢?

    从springboot官方文档摘录如下:


    Do not start your module names with spring-boot, even if you use a different Maven groupId. We may offer official support for the thing you auto-configure in the future.
    As a rule of thumb, you should name a combined module after the starter.

    从这段话可以看出spring-boot-starter命名的潜规则。

    命名潜规则

    spring-boot-starter-XX是springboot官方的starter

    XX-spring-boot-starter是第三方扩展的starter

    打印方法执行时间的功能,需要用到aop,咱们的项目就叫做

    aspectlog-spring-boot-starter吧。

    项目的pom文件如下:

    
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>aspectlog-spring-boot-starter</artifactId>
        <version>1.0.2</version>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.15.RELEASE</version>
        </parent>
        
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-autoconfigure</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
        </dependencies>
    
    </project>
    

    关于spring-boot-configuration-processor的说明,引自springBoot官方文档:

    Spring Boot uses an annotation processor to collect the conditions on auto-configurations in a metadata file ( META-INF/spring-autoconfigure-metadata.properties ). If that file is present, it is used to eagerly filter auto-configurations that do not match, which will improve startup time. It is recommended to add the following dependency in a module that contains auto-configurations:

    org.springframework.boot

    spring-boot-autoconfigure-processor

    true

    简单说就是:写starter时,在pom中配置spring-boot-autoconfigure-processor,在编译时会自动收集配置类的条件,写到一个META-INF/spring-autoconfigure-metadata.properties中。

    第二步写自动配置逻辑

    各种condition

    本次我们就选用@ConditionalOnProperty。即配置文件中有aspectLog.enable=true,才加载我们的配置类。

    下面开始写自动配置类

    2.1.定义AspectLog注解,该注解用于标注需要打印执行时间的方法。

    2.2定义配置文件对应类

    2.3定义自动配置类

    配置类简要说明:

    @ConditionalOnProperty(prefix = "aspectLog", name = "enable",havingValue = "true", matchIfMissing = true)
    

    当配置文件有aspectLog.enable=true时开启,如果配置文件没有设置aspectLog.enable也开启。

    第三步META-INF/spring.factories

    META-INF/spring.factories是spring的工厂机制,在这个文件中定义的类,都会被自动加载。多个配置使用逗号分割,换行用\

    如果有兴趣可以查看这2篇blog:

    2.@Enable驱动原理(设置连接)

    3.@EnableAutoConfiguration处理逻辑(设置连接)

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.shanyuan.autoconfiguration.aspectlog.AspectLogAutoConfiguration
    

    第四步打包测试

    这是我们最终的目录结构

    在IDEA中,进行mvn intall

    打包完成后,在其他项目中的pom中引入进行测试

    相关文章

      网友评论

          本文标题:只需4步,自己搞个 Spring Boot Starter !

          本文链接:https://www.haomeiwen.com/subject/spfkdktx.html