编写自定义的springbootstarter
原理
使用一个公用的starter的时候,只需要将相应的依赖添加的Maven的配置文件当中即可,免去了自己需要引用很多依赖类,并且SpringBoot会自动进行类的自动配置。那么SpringBoot是如何知道要实例化哪些类,并进行自动配置的呢?
首先,SpringBoot在启动时会去依赖的starter包中寻找resourcesMETAINFspring。factories文件,然后根据文件中配置的Jar包去扫描项目所依赖的Jar包,这类似于Java的SPI机制。
第二步,根据spring。factories配置加载AutoConfigure类。
最后,根据Conditional注解的条件,进行自动配置并将Bean注入SpringContext上下文当中。
我们也可以使用ImportAutoConfiguration({MyServiceAutoConfiguration。class})指定自动配置哪些类。实现
终于到了代码实现的步骤,接下来就开始编码我们自己的SpringBootstarter。第一步创建一个SpringBoot项目,并添加下面两个依赖到pom。xml文件当中dependenciesdependencygroupIdorg。springframework。bootgroupIdspringbootconfigurationprocessorartifactIdoptionaltrueoptionaldependencydependencygroupIdorg。springframework。bootgroupIdspringbootautoconfigureartifactIddependencydependencies
其中springbootconfigurationprocessor的作用是编译时生成springconfigurationmetadata。json,此文件主要给IDE使用。如当配置此jar相关配置属性在application。yml,你可以用ctlr鼠标左键点击属性名,IDE会跳转到你配置此属性的类中。
我们日常使用的Spring官方的Starter一般采取springbootstarter{name}的命名方式,如springbootstarterweb。
而非官方的Starter,官方建议artifactId命名应遵循{name}springbootstarter的格式。例如:zdyspringbootstarter。groupIdcom。zdygroupIdzdyspringbootstarterartifactIdversion1。0。0SNAPSHOTversionpackagingjarpackaging第二步编写我们的Service类
这里讲一下我们的Starter要实现的功能,很简单,提供一个Service,包含一个能够将配置文件中配置的字符串根据传入的字符进行分割的方法String〔〕split(StringseparatorChar)。publicclassStarterService{privateStringconfig;publicStarterService(Stringconfig){this。configconfig;}publicString〔〕split(StringseparatorChar){returnStringUtils。split(this。config,separatorChar);}}第三步编写配置文件读取类ConfigurationProperties(com。service)publicclassStarterServiceProperties{privateStringconfig;publicvoidsetConfig(Stringconfig){this。configconfig;}publicStringgetConfig(){returnconfig;}}第四步,编写AutoConfigure类,这步是关键点ConfigurationConditionalOnClass(StarterService。class)EnableConfigurationProperties(StarterServiceProperties。class)publicclassStarterAutoConfigure{AutowiredprivateStarterServicePropertiesproperties;BeanConditionalOnMissingBeanConditionalOnProperty(prefixcom。service,valueenabled,havingValuetrue)StarterServicestarterService(){returnnewStarterService(properties。getConfig());}}
解释一下代码中用到的几个注解:ConditionalOnClass,当classpath下发现该类的情况下进行自动配置。ConditionalOnMissingBean,当SpringContext中不存在该Bean时。ConditionalOnProperty(prefixcom。service,valueenabled,havingValuetrue),当配置文件中com。service。enabledtrue时。下面列举SpringBoot中的所有Conditional注解及作用ConditionalOnBean:当容器中有指定的Bean的条件下ConditionalOnClass:当类路径下有指定的类的条件下ConditionalOnExpression:基于SpEL表达式作为判断条件ConditionalOnJava:基于JVM版本作为判断条件ConditionalOnJndi:在JNDI存在的条件下查找指定的位置ConditionalOnMissingBean:当容器中没有指定Bean的情况下ConditionalOnMissingClass:当类路径下没有指定的类的条件下ConditionalOnNotWebApplication:当前项目不是Web项目的条件下ConditionalOnProperty:指定的属性是否有指定的值ConditionalOnResource:类路径下是否有指定的资源ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的BeanConditionalOnWebApplication:当前项目是Web项目的条件下最后一步,在resourcesMETAINF下创建spring。factories文件,并添加如下内容:org。springframework。boot。autoconfigure。EnableAutoConfigurationcom。example。autocinfigure。StarterAutoConfigure
至此,我们的一个Starter代码部分就是完成了,下面将项目安装到本地Maven仓库中。发布
在项目根目录执行mvninstall进行打包安装。测试
将Starter项目的依赖添加到我们自己的SpringBoot项目中dependencygroupIdcom。zdygroupIdzdyspringbootstarterartifactIdversion1。0SNAPSHOTversiondependency
在application。yml配置文件中添加配置信息:comserviceenabled:trueconfig:a,b,c
在本地使用JUnit进行代码测试AutowiredprivateStarterServicestarterService;TestpublicvoidstarterTest(){String〔〕splitArraystarterService。split(,);System。out。println(splitArray);}
好,到这我们的一个自定义Stater就完成了
成长的故事作文600字初中初中生成长的故事作文600字成长记录着痛苦,也镌刻下欢乐,沿着成长的足迹,一步步,就成了一个个的故事,下面是品学网小编给大家整理的初中生成长的故事作文600字,希望能帮到大家!成长的故事作文600字初中1……
游南京珍珠泉风景区今天晴空万里,我们开开心心地去南京珍珠泉风景区玩。一进入大门,两边树木葱茏,在微风的吹拂下,它们摇动着优美的身姿,好像在欢迎我们的到来。远远就能听见泉水的哗哗声。来到泉边……
真正的高端净水器品牌有哪几个?什么样的好?高端净水器品牌哪个值得买?从网上售价情况的人气指数看,大家选择史密斯(A。O。Smith)家用净水器很多。见下图所示。这一款家用净水器采用专利MAX3。0反渗透滤芯……
元宇宙趋势下,普通人的机遇引言元宇宙通俗的讲就是平行于现实世界的虚拟空间。随着通讯技术、人工智能技术、区块链技术等的发展,元宇宙逐步具备了技术可行性;随着移动互联网用户的规模不断扩张,线下经济向线……
假如给我三天光明给我的启示作文600字海伦middot;凯勒被评为20世纪美国的十大偶像之一是当之无愧的,这本书《假如给我三天光明》是伟大的经历和平凡的故事完美的结合。海伦middot;凯勒堪称人类意志力的伟大偶像……
给自己一个微笑比尔183;盖茨,最令人不能忘记的就是他成功的经验,他说过这样一段话:我成功是因为当所有的人都沉浸在失败的痛楚中,我却早已开始了新的设计。当所有的人都享受在成功的喜悦中,我却早……
Python设计模式工厂方法模式今日分享主题:Python工厂方法模式工厂,大家一般能想到的是生产产品的地方,在设计模式中,工厂可分为:简单工厂模式、工厂方法模式。在前期推文Python简单工厂模式中有……
升级iOS14。7。1后,大量iPhone信号无服务,附一些开始之前数码盖饭回答一些卡贴机的问题,最新的系统是支持卡贴黑解的,按照数码盖饭朋友圈发的步骤和最新的ICCID即可黑解你的手机,手机黑解之后是支持去卡贴使用,也支持换卡和国行一……
可爱的小猫咪小学六年级作文小小年纪胡子翘,看见小鱼喵喵叫,爱洗脸爱理毛,老鼠看见连忙跑,大家已经猜到了吧,这就是可爱的小猫咪。小猫身上毛茸茸的,眼睛就像黑色的玻璃球似的,它还有一个樱桃小嘴,圆圆的……
为什么在助听器验配中心试听效果很好,回家感觉不太一样呢?助听器是在平时用到比较频繁的一种辅助的用计,助听器的主要作用是可以结合了各种各样的音效传播来达到一个放大的效果,可以让很多有听力障碍的人再次听到外界的声音,帮助许多耳朵出现问题……
奶奶的手作文400字奶奶的手和我们的手一点都不一样,我们的手白白嫩嫩的,而奶奶的手上却布满了老茧;我们的手特别特别的光滑,而奶奶的手却很粗糙。每周回家时,我总能看见奶奶在劳动。(扫地、拖地、……
太阳冰雹雨的初一作文话说本来南方的天气就怪。热不好好热,冷不好好冷。热得叫非洲人民要回家,冷得北方人叫寒。谁知今年的天气更怪,冷一天热一天,各种狂风暴雨,偏又能将人热的汗如雨下。这周,竟然还下了冰……
绿林大冒险观后感七篇绿林大冒险观后感(一)上周四学校组织我们到铁西工人礼堂观看了动画电一影,名为《绿林大冒险》。电一影讲述的是一个名叫小雨的女孩为了拯救绿林星球,不怕危险,勇敢顽强,坚……
书迷纪录片观后感01hr这部片子从视觉上来讲,真的是我这样的外貌星人的福利啊!调色清新自然,简直可以狠甩国产影视剧做作的调色几条街。剪辑很自然,拍摄也很唯美!颜控党不能错过,这是不看文案内容也……
快乐的一件事优秀作文500字每个人生中都有一件快乐的事,我也不例外。有一天,我和爸爸妈妈去动物园玩,一进动物园,那里有很多动物,有猴子,有大象,有老虎和狮子,还有最毒的蛇首先我先去看猴子,因为……
初一日记人民公园国庆节放假了,我和妈妈一起来到郑州人民公园玩。在这里我第一次玩了过山车,还明白了一点道理。今天,来的目的就是玩过山车。一进门,我就朝过山车方向奔去。一到地点,我便傻眼了,……
peeweeorm怎样删除重复项?Peewee是一个简单小巧的PythonORM,它非常容易学习,并且使用起来很直观。这是官方文档,中文的:peeweepeewee3。14。4文档今天重点讲一下怎么……
香蕉E度网专稿未经允许不得转载姐姐从海南回来时,给我带回了一串香蕉,因为那里的香蕉最出名。香蕉披着一件黄大衣,弯弯的身体像拱桥,眉毛和月亮。他们长得很漂亮,一串串的,像……
关于初中英语作文分享作为一名初中生,我们知道怎么样书写英语作文吗?以下是小编整理好的关于初中英语作文分享,欢迎大家阅读参考!消费者权益日WorldConsumerRightsDay【1】Co……
高一中秋节日记600字中秋之夜今天是农历八月十五,也是我国的传统节日中秋节。中秋之夜,月亮显得格外圆,也特别亮。家家户户都喜欢坐在一起,一边赏月,一边吃月饼,桌上的月饼各式各样,有豆沙月饼,有水果月饼……
生命的真谛我只是一朵白莲,静静待在你身旁,但我也有一颗心,水的结晶,别人不肯为你干什么,我肯,我会继续绽放,越来越绚烂,不求多少人的赞赏,只求你为看我一眼的回眸一笑hellip;hell……
泡温泉的小学优秀作文今天是中秋节,我们全家人一起到安县去泡温泉。一路上,我们有说有笑,我高兴得像一只快乐的小鸟。走进酒店的大门,穿过一条弯弯曲曲的羊肠小道,远远的,我就听见咕噜咕噜煮水的声音……
人工智能,这五个行业岗位未来很吃香人工智能与人类工作是当下许多人津津乐道的一个话题,而讨论的重点大多是围绕在未来人工智能会不会抢走我们的工作这个方面。本文作者BabakHodjat是人工智能初创企业Sentie……
落叶萧秋的作文不知从何处读过这样的一句话:叶的凋零,是风的追求,还是树的不挽留。起初,冷言嘲讽写句之人,区区一片落叶,不过是新陈代谢的替代品罢了,何以悟出这般饶舌的道理。但后来,我却也在为这……