手写一个stater_手写一个简单的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 com.sqp.example;

import org.redisson.Redisson;

import org.redisson.api.RedissonClient;

import org.redisson.config.Config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;/**

* @author sqp

* @date 2020/7/27 10:29*/@Configuration//条件装配,用于控制bean是否被加载

@ConditionalOnClass(Redisson.class)//RedissonProperties注入到spring ioc容器中

@EnableConfigurationProperties(RedissonProperties.class)public classRedissonAutoConfiguration {/**

* 下面方法引用RedissonProperties说明其已经注入到spring ioc容器中,@EnableConfigurationProperties会加载

* @param redissonProperties

* @return*/@Bean

RedissonClient redissonClient(RedissonProperties redissonProperties){

Config config= newConfig();

String prefix= "redis://";if(redissonProperties.isSsl()){

prefix= "rediss://";

}

config.useSingleServer().setAddress(prefix+redissonProperties.getHost()+":"+redissonProperties.getPort()).setConnectTimeout(redissonProperties.getTimeout());returnRedisson.create(config);

}

}

RedissonProperties

/*** 绑定配置

*@authorsqp

* @date 2020/7/27 10:40*/@Setter

@Getter

@ConfigurationProperties(prefix= "sqp.redisson")public classRedissonProperties {private String host = "localhost";private int port = 6379;private int timeout;//超时时间

private booleanssl;

}

配置文件spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration =\

com.sqp.example.RedissonAutoConfiguration

pom文件

junit

junit

4.11

test

org.springframework.boot

spring-boot-starter

2.1.6.RELEASE

true

org.redisson

redisson

3.13.2

spring-boot-demo工程:

RedissonController

packagecom.sqp.example.springbootdemo;importorg.redisson.api.RBucket;importorg.redisson.api.RedissonClient;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/***@authorsqp

* @date 2020/7/27 11:40*/@RestController

@RequestMappingpublic classRedissonController {

@AutowiredprivateRedissonClient redissonClient;

@GetMapping("/test")publicString test(){

RBucket bucket= redissonClient.getBucket("name");if(bucket.get() == null){

bucket.set("com.sqp.redisson");

}return bucket.get()+"";

}

}

application.properties配置

sqp.redisson.host=120.77.2.12sqp.redisson.port=6379

pom文件

org.springframework.boot

spring-boot-starter-web

2.3.1.RELEASE

org.springframework.boot

spring-boot-starter-test

test

org.junit.vintage

junit-vintage-engine

com.sqp.example

redisson-spring-boot-starter

1.0-SNAPSHOT

项目构建完成启动

当我们springBoot启动源码中可以看到我们自己写的这个类会自动被加载到spring ioc中,大家可以自己试试。

测试结果:

我们在redis服务器上看到key为name,value为com.sqp.redisson,测试结果没有问题。

备注:这里的value是经过序列化的。

疑问:虽然测试得到了我们想要的,但是在spring-boot-demo中的配置文件中存在一个问题,没有自动提示。

解决:

1、在项目redisson-spring-boot-starter-->resources--->META-INF---->新建additional-spring-configuration-metadata.json文件,格式如下:

{

"properties": [

{

"defaultValue": "localhost",

"name": "sqp.redisson.host",

"description": "redis server address",

"type": "java.lang.String"

},

{

"defaultValue": 6397,

"name": "sqp.redisson.port",

"description": "redis server port",

"type": "java.lang.Integer"

}

]

}

2、redisson-spring-boot-starter项目的pom文件添加依赖包。

org.springframework.boot

spring-boot-configuration-processor

2.1.3.RELEASE

3、把redisson-spring-boot-starter重新打包下 ,看下是否有生成spring-configuration-metadata.json。

自动提示如下:

总结:你会发现其实写starter组件并没有想象中的那么复杂,知其原理再下手,只有自己有多余的时间静下心来好好捋一捋,一点一点的积累,不断的成长,开阔自己的眼界。

多手写代码记忆深刻!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值