SpringBoot的核心就是自动配置,而支持自动配置的是一个个starter项目。除了官方已有的starter,用户本身也能够根据规则自定义本身的starter项目。java
自动化配置需知足如下条件:spring
这里经过maven项目管理工具进行starter的建立。首先咱们须要建立一个简单的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服务类,有两个做用,一个为引入的项目本省的功能性服务,另一个用来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时才进行相应的实例化。
当全部的基础代码和自动配置类都准备完成,就须要对其进行注册。也就是咱们熟悉的META-INF/spring.factories配置文件了。固然,这个须要在本身的项目中进行建立。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.secbro2.msg.MsgAutoConfiguration
在spring.factories配置文件中注册MsgAutoConfiguration类。若是有多个自动配置类,用逗号分隔换行便可。
至此,一个基于Spring Boot的自动配置starter便完成了。使用“maven:install”将其打包到本地maven仓库或上传至私服。其余项目即可以经过maven依赖使用。
在其余项目中,经过如下依赖引入该依赖。
<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的工做流程:
<center>程序新视界:精彩和成长都不容错过</center>