前言
作为一个有架构梦想的程序员,自定义 springboot-starter 是我们必须要掌握的技能。企业中很多项目都会有自己封装 starter 的需求。这也是我 2019 年底出去面试被问过的面试题,当时作为一个刚毕业半年的小白,只会用官方制作好的,的确没有自己去实现过。希望这篇文章能对还不会制作 starter 的同学有帮助~~
什么是 springboot-starter & 工作原理
我们都知道 SpringBoot 这么火的核心原因之一就是它提供了一系列的启动场景 starter ,这里面做好了各种开源组件的封装,引入依赖即可使用。可以回想一下我们项目中整合 Redis 用到的 RedisTemplate ,整合 RabbitMQ 用到的 RabbitTemplate 等,你有没有想过为什么在 application.yml 中配置一些属性就可以直接在程序中注入然后用这些模板类呢?
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private RabbitTemplate rabbitTemplate;
其实原理还是比较容易理解的,以 RedisTemplate 自动配置为例,阅读 RedisAutoConfiguration 类的源码就会发现 ,简单来说就是源码中读取 application.yml 中的相关配置,将这些配置设置到 RedisTemplate 中,然后再将 RedisTemplate 对象注入到 Spring 容器。这样一来,我们需要用的时候,直接从 Spring 容器中拿就可以了。
使用 starter 的好处
以使用分布式任务调度框架 xxl-job 为例,我们参考官网的给的 demo ,首先要在配置文件中配置 address、ip、port 等属性,然后要写个配置类接受这些属性,设置到 XxlJobSpringExecutor 对象,然后再将 XxlJobSpringExecutor 对象注入到 Spring 容器中。
@Configuration
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}") //读取配置文件中的值
private String adminAddresses;
/**
* 注入其他属性省略...
* */
//注入 XxlJobSpringExecutor 到 Spring
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor executor = new XxlJobSpringExecutor();
executor.setAdminAddresses(adminAddresses);
executor.setAppname