当前位置: 首页 > 后端技术 > Java

【SpringBoot】如何自定义SpringBootStarter

时间:2023-04-01 15:52:18 Java

这篇文章介绍的,我们都知道SpringBoot项目都是由starter组成的,比如webstarter,redisstarter等等。我们通过maven引入相应的starter,几乎不需要配置就可以完美使用集成的springmvc或者redis。那么我们如何定制一个starter呢?本文将展示如何使用SpringBoot的自动配置功能来创建您自己的SpringBootStarter。假设需要为我们集成Toy作为启动框架或类,我们希望将其加载到Spring上下文中供我们在应用启动时调用。有的朋友可能会问为什么要这样做呢?最好直接将Toy声明为Springbean。答案肯定是可以的,但是本着快速上手SpringBoot的原则,我们可以像上面的Toy一样,通过引入starter来更快速的使用我们想要集成的功能或特性。再比如mybatis,因为我们不能修改mybatis的源码,其中一种方式是通过@Bean在方法上创建一个SqlSessionFactorybean,在SpringBoot应用中使用。第二种方式是创建starter,在需要mybatis的地方引入mybatis的starter,完成mybatis的集成。在很多项目需要集成mybatis的情况下,starter方式会更快更高效。项目结构本项目分为toy-sample-app和toy-spring-boot-startertoy-sample-app两个模块:演示如何引入startertoy-spring-boot-starter:自己创建的用于构建ToySpringBean的starter模块用于demo项目代码介绍toy-spring-boot-starterMETA-INF/spring.factories文件该文件指定了自动注入的类名,在SpringBoot应用启动时会初始化并加载到上下文中。org.springframework.boot.autoconfigure.EnableAutoConfiguration=\cn.bugkit.toy.autoconfigure.ToyAutoConfigurationToyAutoConfiguration文件@Configuration注解为Spring配置类@EnableConfigurationProperties(ToyProperties.class)注解指定需要使用的属性配置类包cn.bugkit.toy.autoconfigure;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework.boot.context.properties.EnableConfigurationProperties;导入org.springframework.context.annotation.Bean;导入org.springframework.context.annotation.Configuration;/***@authorbugkit*@since2022.2.24*/@Configuration@EnableConfigurationProperties(ToyProperties.class)publicclassToyAutoConfiguration{@AutowiredprivateToyPropertiestoyProperties;@BeanpublicToytoy(){returnnewToy(toyProperties.getName(),toyProperties.getPassword(),toyProperties.getWeight());}}ToyProperties文件该类声明了上述文件的toy()方法需要从application.properties文件中读取的属性,以构建所需的Toy对象。/***@authorbugkit*@since2022.2.24*/@Configuration@ConfigurationProperties(prefix="toy")publicclassToyProperties{私有字符串名称;私有字符串密码;私人重量;publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicStringgetPassword(){返回密码;}publicvoidsetPassword(Stringpassword){this.password=password;}publicintgetWeight(){返回重量;}publicvoidsetWeight(intweight){this.weight=weight;}}Toy文件提供了我们需要的showInfo()方法,具体在toy-sample-app项目中用到publicclassToy{privateStringname;私有字符串密码;私人重量;publicToy(Stringname,Stringpassword,intweight){this.name=name;this.password=密码;this.weight=重量;}publicStringgetName(){返回名称;}公开cvoidsetName(Stringname){this.name=name;}publicStringgetPassword(){返回密码;}publicvoidsetPassword(Stringpassword){this.password=password;}publicintgetWeight(){返回重量;}publicvoidsetWeight(intweight){this.weight=weight;}publicvoidshowInfo(){System.out.println("====================开始============================");System.out.println("玩具[名称:"+名称+",密码:"+密码+",重量:"+重量+"]");System.out.println("===================================================");}}toy-sample-appproject这个项目用来演示如何使用我们自己的toy-spring-boot-starterpom文件pom文件引入starter项目的jarcn.bugkittoy-spring-boot-starter0.0.1-SNAPSHOTToyServicefile该类被注入到starter项目的Toybean中,在ToyService初始化完成后调用Toy的showInfo()方法packagecn.bugkit.toy.app.service;importcn.bugkit.toy.autoconfigure。玩具;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework.stereotype.Service;导入javax.annotation.PostConstruct;/***@authorbugkit*@since2022.2.24*/@ServicepublicclassToyService{@AutowiredprivateToy玩具;@PostConstructpublicvoidinit(){toy.showInfo();}}application.properties文件这个文件的key(比如toy.name)对应starter项目的ToyProperties类toy.name=HelloKittytoy.password=kitty@1234toy.weight=99控制台启动日志。_________/\\/___'_____(_)______\\\(()\___|'_|'_||'_\/_`|\\\\\/___)||_)|||||||(_||)))'|____|.__|_||_|_||_\__,|////=========|_|==============|___/=/_/_/_/::SpringBoot::(v2.6.3)2022-02-2414:53:24.092INFO14652---[main]c.bugkit.toy.app.StarterDemoApplication:在Bennetty74上使用Java1.8.0_211启动StarterDemoApplication,PID14652(E:\ideaProjects\spring-learning\toy-sample-app\target\classesstartedbyBennetty74inE:\ideaProjects\spring-learning)2022-02-2414:53:24.092INFO14652---[main]c.bugkit.toy.app。StarterDemoApplication:未设置活动配置文件,回退到默认配置文件:默认===================开始==========================玩具【名字:HelloKitty,密码:kitty@1234,重量:99】===================结束============================2022-02-2414:53:24.608INFO14652---[main]c.bugkit.toy.app.StarterDemoApplication:在0.888秒内启动StarterDemoApplication(JVM运行时间为1.836)Processfinishedwithexitcode0toy-spring-boot-starter的总结:我们通过SpringBoot的Auto-Configuration特性集成Toytoy-sample-app:在需要starter的地方引入starter的maven依赖,这样Toy就可以使用了SpringBean可选剩余代码查看Github仓库源码,代码地址这里不再赘述:https://github.com/bennetty74...