springboot starter工作原理_面试官:Spring Boot自定义starter的应用场景有哪些?我懵了...

前面的文章我们已经了解了Spring Boot的自动配置原理及应用的整个启动流程,相信大家看完之后都能有一些收获。但是光有理论知识还不足以让我们的代码高大上啊,要是哪天同事需要对接咱写的功能,反手一个starter给他是不是马上成就感满满?哈哈,扯远了……

自定义starter在我们的日常工作中还是非常常见的需求,这篇文章我们就来介绍一下如何自定义一个starter,以及自定义starter在项目中的一些实际应用场景。

我们这个自定义的starter要实现什么功能呢?很简单:

  • 自动装载并对外提供一个HelloWorldService类的bean,包含一个sayHello()方法
  • 能够自动读取并输出配置文件中的属性值

添加依赖

首先,我们新建一个Maven项目,引入spring-boot-autoconfigure依赖:

1f1e8757bb3f897351309154e105d55f.png

添加业务Service

其次,新建一个叫HelloWorldService的类:

866fbc8a03c922593def0b61ccdb1f9e.png

接着,新建一个叫HelloWorldProperties的类:

1a5a04036bb0e54965f8ae5b38a24e9a.png

@ConfigurationProperties(prefix = "funcode.helloworld")

该注解的作用是读取配置文件中以funcode.helloworld开头的键,并将值绑定到HelloWorldProperties类的对应的属性上。

自动配置类

接下来,我们今天的主角即将登场,新建一个叫HelloWorldAutoConfiguration的类:

82555718220ce6e2c9d84a0ce4e1cdeb.png

该类是实现自定义starter的关键,其中有几个点解释一下:

  • @Configuration表明这个类是一个配置类
  • @EnableConfigurationProperties(HelloWorldProperties.class)意思是激活我们的HelloWorldProperties配置类,激活的意思就是说IoC容器已经加载这个bean,它可以被注入到其他地方。
  • @ConditionalOnMissingBean(HelloWorldService.class)其实根据字面意思差不多就能理解,意思就是只有HelloWorldService类型的bean不存在时才会自动加载该bean实例,如果IoC容器中已经存在了该类的bean,则不会再自动加载。

现在,bean类有了、属性绑定类有了、自动配置文件也有了,是不是已经全部完成了呢?

并不是,虽然所有的需要的文件都有了,但是Spring Boot它并不知道这些文件的存在,我们必须告诉他去哪里加载我们的自动配置文件。

添加spring.factories文件

如果看过之前的Spring Boot实现自动配置的原理的文章,那么你就知道我们还需要在项目resources目录下新建META-INF目录、并新建一个spring.factories文件:

61b7e137e46d3f0729fecfc2eb8f0fb3.png

到这一步,我们就完成了自定义一个starter的所有工作,现在我们就到项目中引用一下这个starter吧。

引用自定义starter

首先我们在pom文件中引入自定义的starter:

7916e7635ccf94048d246eecd4aaa376.png

接着我们新建一个HelloWorldController类,并将HelloWorldService注入进来:

7a88ada90ad0445511a904e07ed4196d.png

接下来我们在配置文件里添加一个属性funcode.helloworld.name

0911d01ad34380e897a7458866a1c8a7.png

最后我们运行一下项目,可以看到页面成功输出我们配置的信息:

08aee7ad53e034de9af9ee4f3fad2c5c.png

特别注意:

如果你跟着这篇文章在做,这时候你可能会发现在配置我们自定义starter里面的属性的时候,我们的编辑器并没有像平时使用官方starter那样智能提示我们有哪些可配置的属性,是什么原因导致的呢?要是我们自定义的starter有很多属性,使用起来那也太不方便了吧?

别急,其实只要在我们的自定义starter里多引入一个依赖即可:

1022e2bf85e7443c0b60cbf8f72ae691.png

重新编译、打包一下我们的starter,再来配置一下属性,是不是有提示了:

0a48c8633e81ec65cdb9d295249395d4.png

总结

自定义starter的使用场景通常是封装一些通用的、公共的的组件以方便他人使用,一些常用到的地方如:

  • 发送邮件、短信验证码之类的常用功能可以统一抽取成一个starter,其他项目要使用时直接依赖即可调用
  • 数据库mapper层可以抽取封装成一个starter,其他项目需要使用数据库时直接依赖即可,不在需要每个项目单独提供数据库链接配置类
  • 登录、鉴权之类的公共功能同样可以抽取封装成一个starter,这样就不用每个项目都写一遍了

其他更多、更好的使用场景就留给大家一起来挖掘吧。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值