安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

还在curd吗?封装属于自己的SpringStarter

1月1日 红朱砂投稿
  什么是Starter
  Starter是SpringBoot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境(条件)进行自动配置。
  使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,SpringBoot就能自动扫描并加载相应的模块并设置默认值,做到开箱即用为什么使用Starter
  在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。
  如果我们将这些可独立于业务代码之外的功配置模块封装成一个个starter,并在starter中设置好默认值,复用的时候只需要将其在pom中引用依赖即可,SpringBoot为我们完成自动装配,做到开箱即用。Springboot自动配置
  SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描各个jar包下classpath路径的spring。factories文件,加载自动配置类信息,加载相应的bean信息并启动相应的默认配置。
  SpringBoot提供了针对日常企业应用研发各种场景的springbootstarter依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循约定大于配置的理念。
  大家可以看看我之前写的一篇文章,详细介绍了springboot自动配置的流程:一文搞懂SpringBoot自动配置原理掘金(juejin。cn)spring。factories
  SpringBoot会默认扫描跟启动类平级的包,如果我们的Starter跟启动类不在同一个主包下,需要通过配置spring。factories文件来配置生效,SpringBoot默认加载各个jar包下classpath路径的spring。factories文件,配置的key为org。springframework。boot。autoconfigure。EnableAutoConfigurationStarter开发常用注解
  注解使用已经大大方便我们开发,再也不需要写xml配置文件了,SpringBoot经过查找spring。factories文件,加载自动配置类,而自动配置类中定义了各种运行时判断条件,如ConditionalOnMissingBean(A。class)等,只要ioc容器中没有指定的A类型的bean信息,该配置文件才会生效。
  Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。属性映射注解ConfigurationProperties:配置文件属性值和实体类的映射EnableConfigurationProperties:和ConfigurationProperties配合使用,把ConfigurationProperties修饰的类加入ioc容器。配置bean注解Configuration:标识该类为配置类,并把该类注入ioc容器Bean:一般在方法上使用,声明一个bean,bean名称默认是方法名称,类型为返回值。条件注解Conditional:是根据条件类创建特定的Bean,条件类需要实现Condition接口,并重写matches接口来构造判断条件。ConditionalOnBean:容器中存在指定bean,才会实例化一个BeanConditionalOnMissingBean:容器中不存在指定bean,才会实例化一个BeanConditionalOnClass:系统中有指定类,才会实例化一个BeanConditionalOnMissingClass:系统中没有指定类,才会实例化一个BeanConditionalOnExpression:当SpEl表达式为true的时候,才会实例化一个BeanAutoConfigureAfter:在某个bean完成自动配置后实例化这个beanAutoConfigureBefore:在某个bean完成自动配置前实例化这个beanConditionalOnJava:系统中版本是否符合要求ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化ConditionalOnResource:类路径下是否存在指定资源文件ConditionalOnWebApplication:是web应用ConditionalOnNotWebApplication:不是web应用ConditionalOnJndi:JNDI指定存在项ConditionalOnProperty:配置Configuration的加载规则prefix:配置属性名称的前缀value:数组,获取对应property名称的值,与name不可同时使用name:数组,可与prefix组合使用,组成完整的配置属性名称,与value不可同时使用havingValue:比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置matchIfMissing:缺少该配置属性时是否可以加载。如果为true,没有该配置属性时也会正常加载;反之则不会生效Full全模式和Lite轻量级模式Configuration参数proxyBeanMethods:Full全模式(默认):Configuration(proxyBeanMethodstrue)同一配置类下,当直接调用Bean修饰的方法注入的对象,则调用该方法会被代理,从ioc容器中取bean实列,所以实列是一样的。即单实例对象,在该模式下SpringBoot每次启动都会判断检查容器中是否存在该组件Lite轻量级模式:Configuration(proxyBeanMethodsfalse)同一配置类下,当直接调用Bean修饰的方法注入的对象,则调用该方法不会被代理,相当于直接调用一个普通方法,会有构造方法,但是没有bean的生命周期,返回的是不同的实例。注:proxyBeanMethods是为了让使用Bean注解的方法被代理。而不是Bean的单例多例的设置参数。测试例子这里不展示,可以下载我的代码查看Configuration(proxyBeanMethodsfalse)publicclassAppConfig{放一份myBean到ioc容器BeanpublicMybeanmyBean(){returnnewMybean();}放一份yourBean到ioc容器BeanpublicYourBeanyourBean(){System。out。println();注意:Configuration(proxyBeanMethodsfalse):myBean()方法不代理,直接调用注意:Configuration(proxyBeanMethodstrue):myBean()方法代理,从ioc容器拿returnnewYourBean(myBean());}}
  什么时候用Full全模式,什么时候用Lite轻量级模式?当在你的同一个Configuration配置类中,注入到容器中的bean实例之间有依赖关系时,建议使用Full全模式当在你的同一个Configuration配置类中,注入到容器中的bean实例之间没有依赖关系时,建议使用Lite轻量级模式,以提高springboot的启动速度和性能Starter命名规范Spring官方Starter通常命名为springbootstarter{name}如:springbootstarterwebSpring官方建议非官方Starter命名应遵循{name}springbootstarter的格式:如mybatisspringbootstarter。开发Starter1。创建Starter项目
  新建项目后,要删除main启动类2。添加依赖?xmlversion1。0encodingUTF8?projectxmlnshttp:maven。apache。orgPOM4。0。0xmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:maven。apache。orgPOM4。0。0http:maven。apache。orgxsdmaven4。0。0。xsdparentgroupIdorg。springframework。bootgroupIdspringbootstarterparentartifactIdversion2。6。1versionrelativePath!lookupparentfromrepositoryparentmodelVersion4。0。0modelVersiongroupIdcom。ljwgroupIdljwspringbootstarterartifactIdversion1。0versionpropertiesjava。version1。8java。versionmaven。compiler。source8maven。compiler。sourcemaven。compiler。target8maven。compiler。targetpropertiesdependenciesdependencygroupIdorg。springframework。bootgroupIdspringbootstarterartifactIddependency!包含自动配置的代码dependencygroupIdorg。springframework。bootgroupIdspringbootautoconfigureartifactIddependency!配置文件点击可以跳转实体dependencygroupIdorg。springframework。bootgroupIdspringbootconfigurationprocessorartifactIdoptionaltrueoptionaldependencydependenciesproject我们没有main入口,需要去除pom文件中maven打包插件springbootmavenpluginspringbootconfigurationprocessor作用:springbootconfigurationprocessor其实是一个注解处理器,在编译阶段干活的,一般在maven的声明都是optional为true你在idea里面可以点击port,进到这个字段里面,还可以看到配置的提示信息这是因为在你的资源文件里面有一个springconfigurationmetadata。json文件,这是spring配置的元数据,是json形式3。编写属性类
  ConfigurationProperties可以定义一个配置信息类,和配置文件进行映射ConfigurationProperties(prefixljw。config)publicclassHelloProperties{privateStringnamehello默认值!;privateintage8;publicintgetAge(){}publicvoidsetAge(intage){this。}publicStringgetName(){}publicvoidsetName(Stringname){this。}}4。自定义业务类
  这里可以模拟一些获取了配置文件信息的进行业务操作的业务类publicclassHelloService{privateSpublicStringgetName(){}publicvoidsetName(Stringname){this。}publicintgetAge(){}publicvoidsetAge(intage){this。}publicStringhello(){returnHelloService{namename,ageage};}}5。编写自动配置类
  命名规范:XxxAutoConfigurationConfiguration(proxyBeanMethodsfalse)当存在某个类时,此自动配置类才会生效ConditionalOnClass(value{HelloService。class})导入我们自定义的配置类,供当前类使用EnableConfigurationProperties(valueHelloProperties。class)只有非web应用程序时此自动配置类才会生效ConditionalOnWebApplication判断ljw。config。flag的值是否为true,matchIfMissingtrue:没有该配置属性时也会正常加载ConditionalOnProperty(prefixljw。config,nameflag,havingValuetrue,matchIfMissingtrue)publicclassHelloAutoConfiguration{paramhelloProperties直接方法签名入参注入HelloProperties,也可以使用属性注入returnBeanConditionalOnMissingBean(HelloService。class)ConditionalOnProperty(prefixljw。config,nameflag,havingValuetrue,matchIfMissingtrue)publicHelloServicehelloService(HelloPropertieshelloProperties){HelloServicehelloServicenewHelloService();把获取的信息注入helloService。setName(helloProperties。getName());helloService。setAge(helloProperties。getAge());returnhelloS}}
  注:这里配置一个web应用才能注入,并且ljw。config。flag的值是否为true或者不配置该key才能注入HelloService服务6。编写spring。factories
  把自动配置类HelloAutoConfiguration配置到org。springframework。boot。autoconfigure。EnableAutoConfiguration的key下,springboot会自动加载该文件并根据条件装配org。springframework。boot。autoconfigure。EnableAutoConfigurationcom。ljw。starter。config。HelloAutoConfiguration7。编写配置提示文件(非必须)additionalspringconfigurationmetadata。json
  配置additionalspringconfigurationmetadata。json文件后,在开发人员的IDE工具使用个人编写的配置读取很有效的在application。properties或application。yml文件下完成提示。
  配置详细格式参数可查看文档
  我的配置:{properties:〔{name:ljw。config。name,type:java。lang。String,defaultValue:hello默认值!这里配置的是提示,真正默认值在Properties里面,description:这是字符串名称啊。},{name:ljw。config。age,defaultValue:8,description:这是int类型的年龄啊。,deprecation:{reason:过时原因。,replacement:替代key是:ljw。config。age22,level:warning}}〕}
  大家参考下面properties表格进行配置上的理解。
  名称
  类型
  目的
  name
  String
  属性的全名。名称采用小写的周期分隔形式(例如server。address)。此属性是强制性的。
  type
  String
  属性的数据类型的完整签名(例如java。lang。String),但也是完整的泛型类型(例如java。util。Mapjava。util。String,acme。MyEnum)。您可以使用此属性来指导用户可以输入的值的类型。为了保持一致性,通过使用其包装对应项(例如,boolean变为java。lang。Boolean)来指定基元的类型。请注意,此类可能是一个复杂类型,它从Stringas绑定的值转换而来。如果类型未知或基本类型,则可以省略。
  description
  String
  可以向用户显示的组的简短描述。如果没有可用的描述,则可以省略。建议描述为简短段落,第一行提供简明摘要。描述中的最后一行应以句点(。)结尾。
  sourceType
  String
  贡献此属性的源的类名称。例如,如果属性来自带注释的类ConfigurationProperties,则此属性将包含该类的完全限定名称。如果源类型未知,则可以省略。
  defaultValue
  Object
  默认值,如果未指定属性,则使用该值。如果属性的类型是数组,则它可以是值数组。如果默认值未知,则可以省略。
  deprecation
  数组
  过时的描述。
  deprecation每个properties元素的属性中包含的JSON对象可以包含以下属性:
  名称
  类型
  目的
  level
  String
  弃用级别,可以是warning(默认)或error。当属性具有warning弃用级别时,它仍应绑定在环境中。但是,当它具有error弃用级别时,该属性不再受管理且不受约束。
  reason
  String
  该属性被弃用的原因的简短描述。如果没有可用的原因,可以省略。建议描述为简短段落,第一行提供简明摘要。描述中的最后一行应以句点(。)结尾。
  replacement
  String
  替换此不推荐使用的属性的属性的全名。如果此属性没有替换,则可以省略。springconfigurationmetadata。json
  springconfigurationmetadata。json代码量挺大的,为了方便我们可以通过IDE来生成,这里使用的是idea。
  在idea设置中搜索AnnotationProcessors,接下来勾住Enableannonationprocessing就完成了。在编译打包后的文件中看到自动生成的springconfigurationmetadata。json。这个文件不用我们编写
  下面是自动生成的:{groups:〔{name:ljw。config,type:com。ljw。starter。properties。HelloProperties,sourceType:com。ljw。starter。properties。HelloProperties}〕,properties:〔{name:ljw。config。name,type:java。lang。String,description:这是字符串名称啊。,sourceType:com。ljw。starter。properties。HelloProperties,defaultValue:hello默认值!这里配置的是提示,真正默认值在Properties里面},{name:ljw。config。age,type:java。lang。Integer,description:这是int类型的年龄啊。,sourceType:com。ljw。starter。properties。HelloProperties,defaultValue:8,deprecated:true,deprecation:{level:warning,reason:过时原因。,replacement:替代key是:ljw。config。age22}}〕,hints:〔〕}测试Starter1。前置环境
  install打包自定义starter项目:ljwspringbootstarter
  新建项目:ljwtestspringbootstarter2。添加依赖
  引入打好包的自定义starterdependenciesdependencygroupIdorg。springframework。bootgroupIdspringbootstarterartifactIddependency!测试web应用dependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebartifactIddependency!自定义satrterdependencygroupIdcom。ljwgroupIdljwspringbootstarterartifactIdversion1。0versiondependencydependencies3。测试类ServicepublicclassTestControllerimplementsCommandLineRunner{注入自定义starter服务ResourceprivateHelloServicehelloSOverridepublicvoidrun(String。。。args)throwsException{System。out。println(helloService。hello());}}4。修改配置文件
  输入前缀可以看出已经有提示了
  ljw。config。nameljwhello!ljw。config。age99ljw。config。flagtrue不会注入ljw。config。flagtrue1可以看到哪些自动配置了debugtrue5。运行程序打印HelloService{nameljwhello!,age99}条件注入如果没有springbootstarterweb依赖,不能注入服务HelloService如果配置了ljw。config。flag,值不是true,不能注入服务HelloS如果不配置ljw。config。flag,可以注入6。查看自动配置类生效的方法
  通过启用debugtrue属性,让控制台打印自动配置报告,这样就可以很方便地知道哪些自动配置类生效。HelloAutoConfigurationmatched:ConditionalOnClassfoundrequiredclasscom。ljw。starter。service。HelloService(OnClassCondition)ConditionalOnWebApplication(required)foundsessionscope(OnWebApplicationCondition)ConditionalOnProperty(ljw。config。flagtrue)matched(OnPropertyCondition)HelloAutoConfigurationhelloServicematched:ConditionalOnMissingBean(types:com。ljw。starter。service。HelloSSearchStrategy:all)didnotfindanybeans(OnBeanCondition)
  作者:小伙子vae
  链接:https:juejin。cnpost7047674475331977224
投诉 评论 转载

滴灌通中国投资发展中心总经理李辉小微经济在中国经济的最基层,每经记者:王帆每经编辑:杨夏不久前的3月31日,港交所前总裁李小加创办的滴灌通宣布完成7000万美元B轮融资,融资总金额达到1。2亿美元。在过去,受限于单体规模小且分散,……微美全息科学院虚拟现实技术在数字图书馆建设中的应用摘要:近年来,虚拟现实技术成为备受关注的新兴技术,并被应用到社会各个领域,其中就包括图书馆。作为纳斯达克上市企业微美全息US。WIMI旗下研究机构微美全息科学院的科学家们分析了……柔宇强制员工休假真相文张霏编辑李信柔宇的一个口头放假通知,在一众员工中炸开了锅。近期,柔宇科技多名员工告诉连线Insight,柔宇继欠薪半年后,大量员工被强制休假三个月。我……苹果被判侵权!人民的名义获赔1200余万元你知道中文在线吗?中文在线集团是中国数字出版的开创者之一,也是全球最大的中文数字出版机构之一。这样说你可能还不懂,但如果我说《人民的民义》《康熙大帝》《国家公诉》你一定会熟悉,……企业微信4。0版本推出助力更多企业数字化转型来源:经济日报我们希望去探索一种全新的B2B连接,让企业与企业之间的协同就像在一个公司里那么方便。比如,可以快速找到上下游伙伴,可以一键发起聊天或者发起会议,可以跟伙伴共享一份……除了人类,地球上还有哪种生物意识到地球是一个球体?地球上有着万万千千的生命物种,我们人类只是其中一种,地球是太空中的一个圆球,我们人类当然已经知道地球是球形的,那么还有其他生命物种知道吗?人类在地球上已经生活了一二百万年……英特尔事件至少至目前为止西方已经完败据相关媒体12月21日报道,英特尔在12月给其供应商的一份信中要求,禁用新疆产品。英特尔在经济层面对中国做了一个测试【经济视点】就此事,在第一时间,我们就强调:英特……欧界丨乐视手机时隔四年再回来!新机发布,主打低端产品欧界报道:根据近日消息,乐视网子公司通过官方微博发布了新款乐视手机,采用宝蓝色配色,在背部还有letv的标志,该手机主打低端市场,还配备指纹识别的功能,这也是乐视沉寂四年……还在curd吗?封装属于自己的SpringStarter什么是StarterStarter是SpringBoot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境(条件)……在地球上60公斤的人在月球上有多重?先明确两个物理概念。物体所含物质的多少叫做质量,国际单位制中基本单位是千克(kg),在我国俗称公斤。地面附近的物体由于地球吸引而受到的力叫做物体的重力,简称为物重,国际单位是牛……一夜之间,恒大被约谈,滴滴欲退市,联想持续被深度联想12月3日,恒大发布无法履行担保责任的公告,当晚,被广东省政府约谈,并入驻工作组。12月3日,滴滴发布动态称,即日起启动在纽交所退市的工作,并启动在香港上市的准备工作。……从6999降到3099元,12GB版OPPO旗舰降成二手价,【Tech分析狮】9月25日消息,OPPO在这几年来已经凭借其独特的外观设计基因,以及专注于自拍美颜的执着,推出了不少深受年轻消费者喜欢的旗舰机型。比如这款OPPOFindX2……
2022年性价比最高的手机推荐(20003000元)线上医生软件小程序专业开发线上医生软件专业团队定制开发那些年消失的国产手机品牌,你们知道吗?外媒透露AppleWatchS7屏幕将提升至1。9英寸?苹果谷歌亚马逊已将Matter智能家居标准的发布推迟至202小米用不用华为鸿蒙,谷歌说的算?两部门在5G千兆光网等领域布局一批新型基础设施项目确认了!iPhone13最大的卖点,严重翻车BW2021火爆开启,华硕WiFi6多款二次元新品燃爆全场华为matebooke好吗?3月即将发布的四款给力新机,有你期待的吗?官宣!10月13日1900三星W225G将在杭州大剧院发布

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利