⼿写⼀个简单的starter组件
spring-boot中有很多第三⽅包,都封装成starter组件,在maven中引⽤后,启动springBoot项⽬时会⾃动装配到spring ioc容器中。
思考:
为什么我们springBoot中maven引⽤starter组件,就可以直接去ioc容易中拿到?
猜想是不是springBoot启动去加载这些starter组件?
那么具体是怎么实现呢?
猜想是不是所有的starter组件包都是按照⼀定的格式约束存在于某个⽂件夹下,然后springBoot启动就会去⾃动装配呢?
如果了解了springBoot的⾃动装配,那么我们如何去写⼀个简单的starter组件呢?
带着这些疑问我们继续往下⾛........
⾃动装配的简单说明:
在selectImports⽅法中,它会批量扫描在META-INF/spring.factories的⽂件,遍历把spring.factories中的key和value放⼊内置的缓
存MultiValueMap中。
然后经过移除、过滤⼀些配置,最后加载到spring ioc容器中。原码就不具体讲了,⼤家可以具体去猜想下,然后再去debug看。
备注:有的组件starter命名是在前,有的是在后,⽐如mybatis-spring-boot-starter,spring-boot-starter-web,⼀种代表第三⽅,⼀种代表spring官⽅的,
两者并没有什么区别。
了解完springBoot的⾃动装配后,接下来我们按照这样的模式去⼿写starter组件,准备idea和安装redis。
流程图:
项⽬⼯程图:
redisson-spring-boot-starter⼯程:
RedissonAutoConfiguration 类
package ample;
disson.Redisson;
disson.api.RedissonClient;
fig.Config;
import org.springframework.dition.ConditionalOnClass;
import org.t.properties.EnableConfigurationProperties;
import t.annotation.Bean;
import t.annotation.Configuration;
/**
* @author sqp
* @date 2020/7/27 10:29
*/
@Configuration
// 条件装配,⽤于控制bean是否被加载
@ConditionalOnClass(Redisson.class)
// RedissonProperties注⼊到spring ioc容器中
@EnableConfigurationProperties(RedissonProperties.class)
public class RedissonAutoConfiguration {
/**
* 下⾯⽅法引⽤RedissonProperties说明其已经注⼊到spring ioc容器中,@EnableConfigurationProperties会加载
* @param redissonProperties
spring boot选择题* @return
*/
@Bean
RedissonClient redissonClient(RedissonProperties redissonProperties){
Config config = new Config();
String prefix = "redis://";
if(redissonProperties.isSsl()){
prefix = "rediss://";
}
config.useSingleServer().setAddress(Host()+":"+Port()).Timeout());
ate(config);
}
}
RedissonProperties
/**
* 绑定配置
* @author sqp
* @date 2020/7/27 10:40
*/
@Setter
@Getter
@ConfigurationProperties(prefix = "disson")
public class RedissonProperties {
private String host = "localhost";
private int port = 6379;
private int timeout;// 超时时间
private boolean ssl;
}
配置⽂件spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration =\
ample.RedissonAutoConfiguration
pom⽂件
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.6.RELEASE</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId&disson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.2</version>
</dependency>
</dependencies>
spring-boot-demo⼯程:
RedissonController
package ample.springbootdemo;
disson.api.RBucket;
disson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author sqp
* @date 2020/7/27 11:40
*/
@RestController
@RequestMapping
public class RedissonController {
@Autowired
private RedissonClient redissonClient;
@GetMapping("/test")
public String test(){
RBucket bucket = Bucket("name");
() == null){
bucket.set("disson");
()+"";
}
}
application.properties配置
pom⽂件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>ample</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
项⽬构建完成启动
当我们springBoot启动源码中可以看到我们⾃⼰写的这个类会⾃动被加载到spring ioc中,⼤家可以⾃⼰试试。
测试结果:
我们在redis服务器上看到key为name,value为disson,测试结果没有问题。
备注:这⾥的value是经过序列化的。
疑问:虽然测试得到了我们想要的,但是在spring-boot-demo中的配置⽂件中存在⼀个问题,没有⾃动提⽰。
解决:
1、在项⽬redisson-spring-boot-starter-->resources--->META-INF---->新建additional-spring-configuration-metadata.json⽂件,格式如下:{
"properties": [
{
"defaultValue": "localhost",
"name": "disson.host",
"description": "redis server address",
"type": "java.lang.String"
},
{
"defaultValue": 6397,
"name": "disson.port",
"description": "redis server port",
"type": "java.lang.Integer"
}
}
2、redisson-spring-boot-starter项⽬的pom⽂件添加依赖包。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
3、把redisson-spring-boot-starter重新打包下,看下是否有⽣成spring-configuration-metadata.json。
⾃动提⽰如下:
总结:你会发现其实写starter组件并没有想象中的那么复杂,知其原理再下⼿,只有⾃⼰有多余的时间静下⼼来好好捋⼀捋,⼀点⼀点的积累,不断的成长,开阔⾃⼰的眼界。
多⼿写代码记忆深刻!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论