如何写出SpringBoot官方模样的Starter

前言

写了一个 Sftp 的 Starter,开始写的时候比较混乱,于是看了看 Spring 官方的 Starter,所以本文是我根据官方 Starter 得出的标准 Starter 的理解,下面出现的 Xxx 你可以用 Redis、Hibernate、Sftp 等等名词替换。

文中只是自己的理解,欢迎各位提出自己的意见。

例子

GitHub - Starter for sftp

Gitee - Starter for sftp

依赖

  1. spring-boot-dependencies 中指定了版本的 jar 就不要手动指定,以 spring-boot-dependencies-2.6.1 为例,apache commons 大家族:
<commons-codec.version>1.15</commons-codec.version>
<commons-dbcp2.version>2.9.0</commons-dbcp2.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<commons-pool.version>1.6</commons-pool.version>
<commons-pool2.version>2.11.1</commons-pool2.version>
  1. Starter 依赖传递的 jar 都是需要指定版本的或用户不需要了解这个 jar,比如 Xxx Starter 的使用者就不需要了解 Xxx 具体由什么实现(Xxx 通常使用第三方 jar,比如 Sftp 使用 Jsch)。
  2. 常用的、其他框架也用的 jar 依赖不传递,比如 spring boot starter data redis 需要配合使用的 commons-pool2。

模板类

XxxTemplate 是帮助用户快速使用 Xxx 的帮助类,它一般实现了 XxxOperations 接口(接口定义了一系列模板类提供的便捷方法)。

其中 XxxOperations 接口一定存在 T execute(Callback<T> action) 方法用于执行复杂的 Xxx 操作而不需要考虑连接的建立和释放,而参数 Callback 作为函数式接口只会提供一个方法,方法参数是给用户执行复杂 Xxx 操作的对象 A,返回值 T 的类型由用户指定,最常见的例子是 HibernateCallback

异常

XxxTemplateexecute 方法一定存在两类异常,一种是连接池异常,一种是 Callback 执行时抛出的异常。

  1. 连接池异常:上面提到了模板类屏蔽了从连接池借出、归还和废弃连接,而这些操作可能会产生异常,但使用者一定不想为这部分异常做处理,所以我们要捕获这些异常,并将它们转化成运行时异常 PoolException 再抛出。
  2. Callback 异常:这种异常需要考虑 Callback 类唯一方法的方法参数 A 的方法会不会抛异常以及会抛什么样的异常,解决办法是由 execute 方法里 catch 捕获并转化为自定义的异常(如果 A 的方法抛的异常比较混乱,这样可以为使用者提供一个标准的异常,而不是混乱的),或继续抛并由使用者处理。
posted @ 2022-01-19 13:28  hligy  阅读(64)  评论(0编辑  收藏  举报