SpringBoot自定义starter及自动配置

SpringBoot的核心就是自动配置,而支持自动配置的是一个个starter项目。除了官方已有的starter,用户本身也能够根据规则自定义本身的starter项目。java

自定义starter条件

自动化配置需知足如下条件:spring

  • 根据条件检查classpath下对应的类,也就是说须要提供对应可检查的类;
  • 当知足条件时可以生成定义的Bean,并注册到容器中去;
  • 可以自动配置项目所须要的配置;

自定义spring boot starter

这里经过maven项目管理工具进行starter的建立。首先咱们须要建立一个简单的maven项目。这里咱们以集成某短信服务为例,来建立一个项目。浏览器

建立maven项目

建立一个简单的maven项目,具体步骤省略。可经过intellj idea等IDE进行建立,也可经过maven命令进行建立。springboot

目录结构以下:微信

.
├── pom.xml
├── spring-boot-starter-msg.iml
└── src
    ├── main
    └── test

在pom.xml中引入SpringBoot自动化配置依赖spring-boot-autoconfigure:并发

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

定义Service服务类

定义Service服务类,有两个做用,一个为引入的项目本省的功能性服务,另一个用来springboot自动配置时的判断依据。app

这里定义一个MsgService的类。maven

package com.secbro2.msg;

import com.secbro2.utils.HttpClientUtils;

public class MsgService {

    /**
     * 访问发送短信的url地址
     */
    private String url;

    /**
     * 短信服务商提供的请求keyId
     */
    private String accessKeyId;

    /**
     * 短信服务商提供的KeySecret
     */
    private String accessKeySecret;

    public MsgService(String url, String accessKeyId, String accessKeySecret) {
        this.url = url;
        this.accessKeyId = accessKeyId;
        this.accessKeySecret = accessKeySecret;
    }

    public int sendMsg(String msg) {
        // 调用http服务并发送消息,返回结果
        return HttpClientUtils.sendMsg(url, accessKeyId, accessKeySecret, msg);
    }

    // 省略getter/setter方法
}

其中MsgService用到了一个工具类HttpClientUtils。在HttpClientUtils中只简单打印了请求的参数信息。ide

package com.secbro2.utils;

public class HttpClientUtils {

    public static int sendMsg(String url, String accessKeyId, String accessKeySecret, String msg) {
        //TODO 调用指定url进行请求的业务逻辑
        System.out.println("Http请求,url=" + url + ";accessKeyId=" + accessKeyId + ";accessKeySecret=" + accessKeySecret + ";msg=" + msg);
        return 0;
    }
}

定义配置类

定义MsgProperties配置类,用于封装application.properties或application.yml中的基础配置。这里关于短信发送的配置前缀统一采用msg。spring-boot

@ConfigurationProperties(prefix = "msg")
public class MsgProperties {

    /**
     * 访问发送短信的url地址
     */
    private String url;

    /**
     * 短信服务商提供的请求keyId
     */
    private String accessKeyId;

    /**
     * 短信服务商提供的KeySecret
     */
    private String accessKeySecret;
    
    // 其余参数定义
    // 省略getter/setter方法

}

经过@ConfigurationProperties注解来进行对应的属性的装配。

建立自动化配置类

自动配置类就是一个普通的java类,经过不一样的注解来对其赋予不一样的功能。其中最核心的固然是@Configuration注解。

@Configuration
@ConditionalOnClass(MsgService.class)
@EnableConfigurationProperties(MsgProperties.class)
public class MsgAutoConfiguration {

    /**
     * 注入属性配置类
     */
    @Resource
    private MsgProperties msgProperties;

    @Bean
    @ConditionalOnMissingBean(MsgService.class)
    @ConditionalOnProperty(prefix = "msg", value = "enabled", havingValue = "true")
    public MsgService msgService() {
        MsgService msgService = new MsgService(msgProperties.getUrl(), msgProperties.getAccessKeyId(),
                msgProperties.getAccessKeySecret());
        // 若是提供了其余set方法,在此也能够调用对应方法对其进行相应的设置或初始化。
        return msgService;
    }
}

MsgAutoConfiguration类上的注解,@Configuration用来声明该类为一个配置类;@ConditionalOnClass注解说明只有当MsgService类存在于classpath中时才会进行相应的实例化;@EnableConfigurationProperties将application.properties中对应的属性配置设置于MsgProperties对象中;

msgService方法上的注解,@Bean代表该方法实例化的对象会被加载到容器当中;@ConditionalOnMissingBean指明当容器中不存在MsgService的对象时再进行实例化;@ConditionalOnProperty指定了配置文件中msg.enabled=true时才进行相应的实例化。

添加spring.factories

当全部的基础代码和自动配置类都准备完成,就须要对其进行注册。也就是咱们熟悉的META-INF/spring.factories配置文件了。固然,这个须要在本身的项目中进行建立。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.secbro2.msg.MsgAutoConfiguration

在spring.factories配置文件中注册MsgAutoConfiguration类。若是有多个自动配置类,用逗号分隔换行便可。

至此,一个基于Spring Boot的自动配置starter便完成了。使用“maven:install”将其打包到本地maven仓库或上传至私服。其余项目即可以经过maven依赖使用。

starter项目使用

在其余项目中,经过如下依赖引入该依赖。

<dependency>
    <groupId>com.secbro2</groupId>
    <artifactId>spring-boot-starter-msg</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

而后在当前项目的application.properties中配置对应的参数:

msg.enabled=true
msg.url=127.0.0.1
msg.accessKeyId=10001
msg.accessKeySecret=afelwjfwfwef

好比其余项目一样是Spring Boot项目,则可定义一个简单的Controller来进行测试。

@RestController
public class HelloWorldController {

    @Resource
    private MsgService msgService;

    @RequestMapping("/sendMsg")
    public String sendMsg(){
        msgService.sendMsg("测试消息");
        return "";
    }
}

当经过浏览器访问:http://localhost:8080/sendMsg时,便会打印出以下日志:

Http请求,url=127.0.0.1;accessKeyId=10001;accessKeySecret=afelwjfwfwef;msg=测试消息

说明MsgService对象被自动配置,而且测试经过。

而针对短信发送这样的starter,能够进行进一步拓展,实现短信发送的各类基础功能,而当其余项目须要时只用引入对应的依赖,并配置具体的参数便可立刻使用,是否是很是方便?

总结下Starter的工做流程:

  • Spring Boot在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR包;
  • 根据spring.factories配置加载AutoConfiguration类;
  • 根据@Conditional注解的条件,进行自动配置并将Bean注入Spring容器。


<center>程序新视界:精彩和成长都不容错过</center>

程序新视界-微信公众号

相关文章
相关标签/搜索