SpringBoot之如何自定义一个starter模块

举报
码农飞哥 发表于 2021/05/29 13:22:26 2021/05/29
【摘要】 前言 前面我们说到了在SpringBoot中自定义Enable模块,那么如何在SpringBoot中如何自定义一个Starter模块呢?要想自定义一个Starter模块,就需要理解自动装配的原理。 首先,想想我们自动装配涉及到哪些关键的类或者属性文件?无非就是配置类+spring.factories属性文件。 自定义starter的条件 根据条件检查classpa...

前言

前面我们说到了在SpringBoot中自定义Enable模块,那么如何在SpringBoot中如何自定义一个Starter模块呢?要想自定义一个Starter模块,就需要理解自动装配的原理。
首先,想想我们自动装配涉及到哪些关键的类或者属性文件?无非就是配置类+spring.factories属性文件。

自定义starter的条件

  1. 根据条件检查classpath下对应的类,也就是说需要提供对应可检查的类。
  2. 当满足条件时能够生成自定义的Bean,并注册到容器中去。
  3. 能够自动配置项目所需要的配置。

开始实施

第一步:定义好需要通过配置类来实例化的Bean

public class MsgService { private String url; private String content; public MsgService(String url, String content) { this.url = url; this.content = content; } public String sendMsg() { System.out.println("**********消息发送成功,地址=" + url + ",内容=" + content + ""); return "消息发送成功,地址=" + url + ",内容=" + content + ""; }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这里定义的bean没啥好说的。

第二步: 定义好属性类


@ConfigurationProperties(prefix = "msg")
public class MsgProperties { /** * 消息发送地址 */ private String url; /** * 发送内容 */ private String content; //get,set方法省略

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这里通过@ConfigurationProperties注解将配置文件的前缀为msg的配置信息与自身的属性绑定,所有在配置文件中能配置的属性都在MsgProperties类中封装着,配置文件能配置什么只需要看这个属性类的属性。

第二步:定义好配置类

@Configuration
@ConditionalOnClass(MsgService.class)
@EnableConfigurationProperties(MsgProperties.class)
public class MsgConfiguration { /** * 注入属性类 */ @Autowired private MsgProperties msgProperties; @Bean @ConditionalOnMissingBean({MsgService.class}) public MsgService msgService() { return new MsgService(msgProperties.getUrl(), msgProperties.getContent()); }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

@Bean注解表明该方法实例化的对象会被加载到容器当中;
@ConditionalOnMissingBean注解指明当容器中不存在MsgService的对象时再进行实例化;@EnableConfigurationProperties注解是使MsgProperties生效,也就是将MsgProperties类注入到IOC容器中。
@ConditionalOnClass 注解表明只有classpath下能找到MsgService类时才会构建这个Bean。

第三步:定义好spring.factories属性文件

要想实现自动配置,那么spring.factories属性文件是必不可少的,因为SpringBoot需要通过spring.factories找到需要实例化的配置类。然后通过SPI的方式来实例化。
所以,我们需要在resources 下面增加 META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.jay.config.MsgConfiguration

  
 
  • 1
  • 2

打包上传到本地仓库

上面的步骤都搞好之后,我们这个自定义的starter模块差不多就可以用了,为了上其他项目可以引入我们的自定义的starter模块,我们需要通过mvn install命令将这个starter包上传到我们本地仓库或者私服。

其他项目引入我们自定义的starter模块

1. 引入依赖

	<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId>
		</dependency>
<!--自定义的starter-->
		<dependency> <groupId>com.jay</groupId> <artifactId>springboot-custom-starter2</artifactId> <version>0.0.1-SNAPSHOT</version>
		</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2. 在application.properties文件中增加配置

msg.url=127.0.0.1
msg.content=nice to meet you


  
 
  • 1
  • 2
  • 3

3.测试

@RestController
public class HelloWorldController { @Autowired private MsgService msgService; @RequestMapping(value = "/testSendMsg") public String testSendMsg() { String sendMsg = msgService.sendMsg(); return sendMsg; }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

启动项目,访问接口,结果如下:
在这里插入图片描述

总结

本文完整的演示了一遍如何自定义starter模块。其实理解了自动装配的原理就很好的能自定义一个starter模块。它的工作流程无非就三步:

  1. Spring Boot在启动时会扫描项目所依赖的JAR包,寻找包含spring.factories属性文件的JAR包。
  2. 根据spring.factories配置加载EnableAutoConfiguration。
  3. 根据@Conditional注解的条件,进行自动配置并将Bean注入到Spring容器。
    希望对读者朋友们有所帮助。

参考

SpringBoot自定义starter及自动配置

源码下载

源码下载

文章来源: feige.blog.csdn.net,作者:码农飞哥,版权归原作者所有,如需转载,请联系作者。

原文链接:feige.blog.csdn.net/article/details/107966241

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。