浅谈一下SpringBootStarter的实现
使用Spring cloud的时候,需要使用某些功能的时候,通过引用starter然后做些简单的配置就可以直接使用对应的功能,卧槽,爽,哎,那自己想自己撸一个要怎么实现呢?
官方文档有这么一段
pring Boot 检查已发布的 jar 中是否存在 META-INF/spring.factories 文件。该文件应在 EnableAutoConfiguration 键下列出您的配置类
"EnableAutoConfiguration 键"具体点应该是org.springframework.boot.autoconfigure.EnableAutoConfigurationorg.springframework.boot.autoconfigure.EnableAutoConfiguration= com.mycorp.libx.autoconfigure.LibXAutoConfiguration, com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
定义一个starter包含下面几个步骤:
1、创建自动装配类,Spring boot自动根据spring.factories扫描,可以理解为starter的入口类,多个类会spring.factories配置会按配置的顺序执行。
2、定义配置的承载属性类,用于承载配置文件的配置项
3、定义功能的实现类,在自动装配类里注入
先创建个Maven的项目
spring-boot-configuration-processor并不是必须的,这个在生成jar包之后,会产生一个spring-configuration-metadata.json元数据描述文件,在引用的时候,配置application.properties或者application.yaml的时候可以自动提示配置项。 com.springredis.starter spring-boot-starter-springredis 1.0.1 jar spring-boot-starter-parent org.springframework.boot 2.7.0 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-configuration-processor true
定义自动装配的类package com.springredis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableConfigurationProperties(SpringRedisProperty.class) @ConditionalOnProperty(prefix = "springredis",value = "enabled",matchIfMissing = true) public class SpringRedisAutoConfiguration { /* * 把SpringRedisProperty注入进来,传递给SpringRedisService使用 * */ @Autowired SpringRedisProperty springRedisProperty; /* * 把SpringRedisService自动装配到容器 * */ @Bean public SpringRedisService springRedisService(){ return new SpringRedisService(springRedisProperty); } }
定义配置承载类,读取redis的账号密码服务器ip端口和db的下表package com.springredis; import org.springframework.boot.context.properties.ConfigurationProperties; /* * 以springredis为前缀,配置的时候用springredis.xxxx为key * */ @ConfigurationProperties(prefix = "springredis") public class SpringRedisProperty { private String host; private Integer port; private Integer dbIndex; private String userName; private String password; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public Integer getPort() { return port; } public void setPort(Integer port) { this.port = port; } public Integer getDbIndex() { return dbIndex; } public void setDbIndex(Integer dbIndex) { this.dbIndex = dbIndex; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
定义功能实现类,根据配置(SpringRedisProperty类承载了读取配置文件的值),拼接一个redis的字符串,打印一下日志。package com.springredis; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SpringRedisService { private SpringRedisProperty springRedisProperty; private Logger logger=LoggerFactory.getLogger(SpringRedisService.class); public SpringRedisService(SpringRedisProperty springRedisProperty){ this.springRedisProperty=springRedisProperty; getRedisConnectionString(); } public String getRedisConnectionString(){ String connectionString = this.springRedisProperty.getUserName()+":" + this.springRedisProperty.getPassword()+":" + this.springRedisProperty.getHost() +"@"+this.springRedisProperty.getPort() +"/"+this.springRedisProperty.getDbIndex(); logger.info(connectionString); return connectionString; } }
在resource创建一个META-INF创建一个spring.factories文件org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.springredis.SpringRedisAutoConfiguration
最后生成jar,测试环境就可以开始了。
创建个spring-boot-web org.springframework.boot spring-boot-starter-web com.springredis system spring-boot-starter-springredis 1.0.1 ${project.basedir}/lib/spring-boot-starter-springredis-1.0.1.jar
把生成的starter的jar拷贝到lib目录下(这个文件夹随便定义,在pom对应写上正确的引用路径即可)。
添加starter的配置信息
application.yamlspringredis: host: 127.0.0.1 port: 6379 user-name: aming password: 123456 db-index: 0
其他的业务代码都不写,启动测试一下。
定义个Controller调用一下Service的接口package com.starter.startertest; import com.springredis.SpringRedisService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class StarterController { @Autowired SpringRedisService service; @GetMapping("test") public String GetRedisConnectionString(){ return service.getRedisConnectionString(); } }
nice!!!
边检不是走红毯,法治面前没有明星通道,醒醒吧,大明星们!这几天,一个男偶像余景天上了热搜。不是他多会跳舞,也不是他长的有多帅,更不是他做了什么好人好事值得嘉奖。而是他在机场,被粉丝围着接机乱成一团导致了机场拥堵。按理说,粉丝接机也不是什
华发股份研究报告珠海国资龙头,从地方走向全国(报告出品方作者海通证券,涂力磊,谢盐)1珠海国资背景,从珠海走向全国珠海华发实业股份有限公司(以下简称华发股份)是承接华发集团房产开发板块的平台公司。公司组建于1992年,前身始
建立正确的消费观我发现普通家庭的父母真的很少会在孩子小的时候就有意识地去培养他们的理财观念。大概是因为儒家思想的影响让大家觉得一家人谈钱是一件很俗气的事吧?但实际上一个人的消费观很大程度上来自于自
过去25万年,男性平均30岁当爹,女性呢?文李木子特定世代时间(繁殖一代所需时间)可以告诉人们很多关于人类生物学和社会组织的信息。现在,美国科学家利用DNA突变开发了一种新方法,可以确定人类进化史上女性和男性的平均育龄。这
女性特殊时期的用药(收藏备用)女性一生要经历许多特殊时期,在医学上,妊娠期哺乳期都属于临床特殊人群。特殊人群一般指妊娠期和哺乳期妇女小儿老年人肝病患者肾功能不全患者胃病患者6种类型。特殊人群与一般人群相比生理生
中国人过年能多几天假期吗?有人提议延长到9天!春节应该放几天?最近,有政协委员提议可以延长到9天,具体是将3天假期增加两天,在除夕前两天就开始放,一共放5天,然后4天调休不变,加起来就是9天假日。目前,春节只有7天假,相比之下
想脸部皮肤嫩白祛黄,试试皮秒或超皮秒没有人能拒绝水嫩细滑无瑕透亮的肌肤,当我们被岁月被日晒或是被不知何时出现的种种面部皮肤问题困扰时,激光会成为我们解决问题的贴心伙伴,南方医科大学皮肤病医院医美中心的颜韵灵医师建议,
ELFENLAND体态揭秘明星高级感从何而来一到年底就有各种时尚红毯女明星们用精致妆容疯狂输出而想要在群芳中一枝独秀比的就是气质和体态今日揭秘明星的高级感从何而来?很多明星精修静态图秒杀众人一旦走在红毯上就暴露短处肩部打不开
拉文最后一攻想造犯规但裁判没吹哨北京时间1月12日,华盛顿奇才3分险胜芝加哥公牛,终场前5。1秒,凯尔库兹马投出漂移三分完成准绝杀。落后三分的公牛本有绝平将比赛拖入加时的机会,但是最后一攻扎克拉文没有选择将球传给
蓝牙耳机适合运动吗最受欢迎的蓝牙耳机品牌推荐说到日常生活中必不可少的数码产品,除了手机就属蓝牙耳机了。尤其是蓝牙耳机便捷舒适的佩戴体验,完美解决了有线耳机繁琐打结的问题。蓝牙耳机在运动圈尤为受欢迎,无线的设计再也不担心耳机线
(外代二线)赛车达喀尔拉力赛第九赛段赛况(2)当日,2023年达喀尔拉力赛在沙特阿拉伯结束了从利雅得到哈拉德的第九赛段的比赛。汽车组中,巴林车队的法国车手勒布获得本赛段冠军,丰田车队的卡塔尔车手阿提亚在总积分榜上领先。摩托车组