当前位置: 首页 > 科技观察

徒手卷了一个starter,同事都夸我666~

时间:2023-03-20 11:05:44 科技观察

SpringBootstarter原理SpringBoot将常用的开发功能划分为starter,这样我们开发功能的时候只需要引入对应的starter,而不用再介绍了一堆依赖!starter可以理解为一个依赖组,其主要功能是完成依赖的引入和初始配置。Spring提供的starter命名约定为spring-boot-starter-xxx,第三方提供的starter命名约定为xxx-spring-boot-starter。这里我们使用RocketMQ的依赖rocketmq-spring-boot-starter来学习starter的原理。在项目中引入rocketmq-spring-boot-starter之后,实际上引入了rocketmq的一些相关依赖。rocketmq-spring-boot中有一个自动装配类RocketMQAutoConfiguration。我截取了一小段代码来看一下。@Configuration@EnableConfigurationProperties(RocketMQProperties.class)@ConditionalOnClass({MQAdmin.class})@ConditionalOnProperty(prefix="rocketmq",value="name-server",matchIfMissing=true)@Import({MessageConverterConfiguration.class,ListenerContainerConfiguration.class,ExtProducerResetConfiguration.class,RocketMQTransactionConfiguration.class})@AutoConfigureAfter({MessageConverterConfiguration.class})@AutoConfigureBefore({RocketMQTransactionConfiguration.class})publicclassRocketMQAutoConfiguration{privatestaticfinalLoggerlog=LoggerFactory.getLogger(RocketMQAutoConfiguration.class);publicstaticfinalStringROCKETMQ_TEMPLATE_DEFAULT_GLOBAL_NAME="rocketMQTemplate";@AutowiredprivateEnvironmentenvironment;@Bean(destroyMethod="destroy")@ConditionalOnBean(DefaultMQProducer.class)@ConditionalOnMissingBean(name=ROCKETMQ_TEMPLATE_DEFAULT_GLOBAL_NAME)publicRocketMQTemplaterocketMQTemplate(DefaultMQProducerqProducer,RocketMQMessageConverterrocketMQMessageConverter){RocketMQTemplaterocketMQTemplate=newRocketMQTemplate();rocketMQTemplate.setProducer(mqProducer);rocketMQTemplate.setMessageConverter(rocketMQMessageConverter.getMessageConverter());returnrocketMQTemplate;}}@Configuration说明这是一个配置类,类中被@Bean注解了的方法,是spring的一个bean,比如rocketMQTemplate@EnableConfigurationProperties,它启用了@ConfigurationProperties这个bean,这里介绍RocketMQProperties。RocketMQProperties是yml文件中需要写入的属性。@ConfigurationProperties(prefix="rocketmq")publicclassRocketMQProperties{privateStringnameServer;privateStringaccessChannel;privateProducerproducer;privateConsumerconsumer=newConsumer();}SpringBoot项目启动时,默认只扫描下级目录下有@Configuration注解的类,所以这篇文章提到RocketMQAutoConfiguration如何扫描?其实在项目启动的时候,会加载项目中所有的spring.factories文件,然后加载相应的配置类,所以我们只需要在spring.factories中指定需要扫描的类即可。原理清楚了,接下来我们就简单的实现自己的starter吧!这个启动器的主要功能是在一个对象的末尾拼接一个字符串!1、新建一个项目,新建一个项目,名称为javatip-spring-boot-starter,并引入如下依赖org.springframework.bootspring-boot-starter2.在properties文件中新增配置类配置类对应的属性Forjavatip.name;@ConfigurationProperties(prefix="javatip")publicclassJavatipPorperties{privateStringname;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}三、拼接字符串的方法这个方法主要是为对象拼接一个固定的字符串publicclassStrUt{privateStringname;publicStringstrTo(Objectobject){returnobject+"---"+getName();}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}4.新增自动配置类使用注解@EnableConfigurationProperties启用JavatipProperties配置类使用注解@Configuration配合用@Bean注册一个串联字符串的bean对象。@Configuration@EnableConfigurationProperties(JavatipPoperties.class)publicclassJavatipAutoConfiguration{@AutowiredprivateJavatipPorpertiesjavatipPorperties;@BeanpublicStrUtstrut(){StrUtstrut=newStrUt();strut.setName(javatipPorts.getName());returnstrut;在META-INF文件夹下新建一个META-INF文件夹,在META-INF文件夹下新建一个配置发现文件spring.factories,将自动配置类写入文件中。org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.javatip.str.configuration.JavatipAutoConfiguration6.打包测试使用mvninstall命令将项目打包推送到本地maven仓库,然后新建测试项目并引入打包好的依赖项。com.javatipjavatip-spring-boot-starter0.0.1-SNAPSHOT写在application.yml中文件输入自动拼接字符串对应的属性javatip.name。javatip:name:JavaJourney手写一个测试类:@RestControllerpublicclassTest{@AutowiredprivateStrUtstrUt;@GetMapping("test")publicStringtest(){Stringstr=strUt.strTo("whoareyou?");returnstr;}}运行后测试类,页面返回whoareyou?---JavaJourney,一个简单的starter就做好了,只要了解了starter的原理,实现起来就很简单,第一点,starter相当于一个依赖组,还有一点就是启动器可以完成初始配置。本文转载自微信公众号“Java之旅”,可通过以下二维码关注。转载本文请联系Java之旅公众号。