浅谈一下SpringBootStarter的实现
使用Springcloud的时候,需要使用某些功能的时候,通过引用starter然后做些简单的配置就可以直接使用对应的功能,卧槽,爽,哎,那自己想自己撸一个要怎么实现呢?
官方文档有这么一段
pringBoot检查已发布的jar中是否存在METAINFspring。factories文件。该文件应在EnableAutoConfiguration键下列出您的配置类
EnableAutoConfiguration键具体点应该是org。springframework。boot。autoconfigure。EnableAutoConfigurationorg。springframework。boot。autoconfigure。EnableAutoConfigurationcom。mycorp。libx。autoconfigure。LibXAutoConfiguration,com。mycorp。libx。autoconfigure。LibXWebAutoConfiguration
定义一个starter包含下面几个步骤:
1、创建自动装配类,Springboot自动根据spring。factories扫描,可以理解为starter的入口类,多个类会spring。factories配置会按配置的顺序执行。
2、定义配置的承载属性类,用于承载配置文件的配置项
3、定义功能的实现类,在自动装配类里注入
先创建个Maven的项目
springbootconfigurationprocessor并不是必须的,这个在生成jar包之后,会产生一个springconfigurationmetadata。json元数据描述文件,在引用的时候,配置application。properties或者application。yaml的时候可以自动提示配置项。groupIdcom。springredis。startergroupId!starter的名称springbootstarterspringredisartifactIdversion1。0。1version!打包成jarpackagingjarpackagingparentspringbootstarterparentartifactIdgroupIdorg。springframework。bootgroupIdversion2。7。0versionparentdependenciesdependencygroupIdorg。springframework。bootgroupIdspringbootstarterartifactIddependencydependencygroupIdorg。springframework。bootgroupIdspringbootconfigurationprocessorartifactIdoptionaltrueoptionaldependencydependencies
定义自动装配的类packagecom。springredis;importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。boot。autoconfigure。condition。ConditionalOnProperty;importorg。springframework。boot。context。properties。EnableConfigurationProperties;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。Configuration;ConfigurationEnableConfigurationProperties(SpringRedisProperty。class)ConditionalOnProperty(prefixspringredis,valueenabled,matchIfMissingtrue)publicclassSpringRedisAutoConfiguration{把SpringRedisProperty注入进来,传递给SpringRedisService使用AutowiredSpringRedisPropertyspringRedisProperty;把SpringRedisService自动装配到容器BeanpublicSpringRedisServicespringRedisService(){returnnewSpringRedisService(springRedisProperty);}}
定义配置承载类,读取redis的账号密码服务器ip端口和db的下表packagecom。springredis;importorg。springframework。boot。context。properties。ConfigurationProperties;以springredis为前缀,配置的时候用springredis。xxxx为keyConfigurationProperties(prefixspringredis)publicclassSpringRedisProperty{privateStringhost;privateIntegerport;privateIntegerdbIndex;privateStringuserName;privateStringpassword;publicStringgetHost(){returnhost;}publicvoidsetHost(Stringhost){this。hosthost;}publicIntegergetPort(){returnport;}publicvoidsetPort(Integerport){this。portport;}publicIntegergetDbIndex(){returndbIndex;}publicvoidsetDbIndex(IntegerdbIndex){this。dbIndexdbIndex;}publicStringgetUserName(){returnuserName;}publicvoidsetUserName(StringuserName){this。userNameuserName;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this。passwordpassword;}}
定义功能实现类,根据配置(SpringRedisProperty类承载了读取配置文件的值),拼接一个redis的字符串,打印一下日志。packagecom。springredis;importorg。slf4j。Logger;importorg。slf4j。LoggerFactory;publicclassSpringRedisService{privateSpringRedisPropertyspringRedisProperty;privateLoggerloggerLoggerFactory。getLogger(SpringRedisService。class);publicSpringRedisService(SpringRedisPropertyspringRedisProperty){this。springRedisPropertyspringRedisProperty;getRedisConnectionString();}publicStringgetRedisConnectionString(){StringconnectionStringthis。springRedisProperty。getUserName():this。springRedisProperty。getPassword():this。springRedisProperty。getHost()this。springRedisProperty。getPort()this。springRedisProperty。getDbIndex();logger。info(connectionString);returnconnectionString;}}
在resource创建一个METAINF创建一个spring。factories文件org。springframework。boot。autoconfigure。EnableAutoConfigurationcom。springredis。SpringRedisAutoConfiguration
最后生成jar,测试环境就可以开始了。
创建个springbootwebdependenciesdependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebartifactIddependencydependencygroupIdcom。springredisgroupIdscopesystemscopespringbootstarterspringredisartifactIdversion1。0。1versionsystemPath{project。basedir}libspringbootstarterspringredis1。0。1。jarsystemPathdependencydependencies
把生成的starter的jar拷贝到lib目录下(这个文件夹随便定义,在pom对应写上正确的引用路径即可)。
添加starter的配置信息
application。yamlspringredis:host:127。0。0。1port:6379username:amingpassword:123456dbindex:0
其他的业务代码都不写,启动测试一下。
定义个Controller调用一下Service的接口packagecom。starter。startertest;importcom。springredis。SpringRedisService;importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。web。bind。annotation。GetMapping;importorg。springframework。web。bind。annotation。RestController;RestControllerpublicclassStarterController{AutowiredSpringRedisServiceservice;GetMapping(test)publicStringGetRedisConnectionString(){returnservice。getRedisConnectionString();}}
nice!!!