19电子设计速成实战宝典pdf_实战|如何自定义SpringBoot Starter?

本文介绍了如何自定义SpringBoot Starter,通过创建spring-boot-starter-helloworld项目,设置自动化配置和属性类,并在META-INF/spring.factories中配置自动化配置类。此外,还展示了如何在其他项目中引用自定义的Starter。

点击上方 IT牧场 ,选择 置顶或者星标技术干货每日送达!>>>技术讨论群<<<

我在「SpringBoot自动化配置源码分析」从源码的角度讲解了 SpringBoot 自动化配置的原理,知道了它最终要干的事情不过是读取 META-INF/spring.factories 中的自动化配置类而已。

SpringBoot 项目就是由一个一个 Starter 组成的,一个 Starter 代表该项目的 SpringBoot 起步依赖,除了官方已有的 Starter,如果你需要将自己的项目支持 SpringBoot,那么就需要把它制作成一个 Starter。这篇博客依据 SpringBoot 的自动化配置原理,开发一个属于自己的 Starter。

自定义 Starter

自动化配置需满足两个条件:

1.能够生成 Bean,并注册到 Bean 容器中;2.能够自动配置项目所需要的配置。

在这里创建一个 spring-boot-starter-helloworld 项目作为例子,实现以上两点。

引入 SpringBoot 自动化配置依赖:

<dependencies>  <dependency>    <groupId>org.springframework.bootgroupId>    <artifactId>spring-boot-autoconfigureartifactId>    <version>1.5.9.RELEASEversion>  dependency>dependencies>

spring-boot-starter-helloworld 只是作为例子演示自定义 starter 的过程,实现的功能很简单就是创建一个 HelloworldService 的,并配置 sayHello() 方法打印的语句。

public class HelloworldService {  private String words;  private String getWords() {    return words;  }  public void setWords(String words) {    this.words = words;  }  public String sayHello() {     return "hello, " + words;  }}

创建属性类,prefix = "helloworld"代表该项目在属性文件中配置的前缀,即可以在属性文件中通过 helloworld.words=springboot,就可以改变属性类字段 words 的值了。

@ConfigurationProperties(prefix = "helloworld")public class HelloworldProperties {  public static final String DEFAULT_WORDS = "world";  private String words = DEFAULT_WORDS;  public String getWords() {    return words;  }  public void setWords(String words) {    this.words = words;  }}

创建自动化配置类,这个相当于就是一个普通的 Java 配置类,可以在这里创建 Bean,并可获得与 application.properties 属性文件相对应的属性类的 Bean。

// 相当于一个普通的 java 配置类@Configuration// 当 HelloworldService 在类路径的条件下@ConditionalOnClass({HelloworldService.class})// 将 application.properties 的相关的属性字段与该类一一对应,并生成 Bean@EnableConfigurationProperties(HelloworldProperties.class)public class HelloworldAutoConfiguration {  // 注入属性类  @Autowired  private HelloworldProperties hellowordProperties;  @Bean  // 当容器没有这个 Bean 的时候才创建这个 Bean  @ConditionalOnMissingBean(HelloworldService.class)  public HelloworldService helloworldService() {    HelloworldService helloworldService = new HelloworldService();    helloworldService.setWords(hellowordProperties.getWords());    return helloworldService;  }}

在 META-INF 目录下创建 spring.factories,这个属性文件可重要啦,因为 SpringBoot 自动化配置最终就是要扫描 META-INF/spring.factories 来加载项目的自动化配置类。

# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=com.objcoding.starters.helloworld.HelloworldAutoConfiguration

引用 Starter

为了引入 starter,我在这里再创建一个 spring-boot-starter-helloworld-sample 项目。

添加 spring-boot-starter-helloworld 起步依赖:

<dependency>  <groupId>com.objcodinggroupId>  <artifactId>spring-boot-starter-helloworldartifactId>  <version>1.0-SNAPSHOTversion>dependency>

在 application.properties 中添加属性:

helloworld.words=springboot

在 SpringBoot 主程序中 注入 helloworldService

@RestController@SpringBootApplicationpublic class HelloworldApplication {  @Autowired  private HelloworldService helloworldService;  @GetMapping("/")  public String sayHello() {    return helloworldService.sayHello();  }  public static void main(String[] args) {    SpringApplication.run(HelloworldApplication.class, args);  }}

访问 http://localhost:8080/,打印以下结果:

86653c6c6f273382dc2027b41b215108.png

Demo源码地址:https://github.com/objcoding/spring-boot-starter-tutorial

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术群讨论

近期热文

•推荐10款笔者一直在使用的Chrome提效插件•MongoDB自动备份全过程实录•Spring Boot Banner自定义,让你的应用与众不同•史上最污技术解读,我竟然秒懂了!•项目中常用的19条MySQL优化技巧•反应式编程在微服务下的重生•Docker&Kubernetes系列文章汇总

关注我

43c6c4b2692cb3e54edbfb6963dacd65.png

喜欢就点个"在看"呗^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值