我看到Spring boot项目以某种方式组织了starter,即starters模块中仅具有 pom 依赖项,并且 autoconfiguration是一个单独的项目,其中 all pom dependencies所有启动器已作为可选依赖项添加。
这是与 Apache Camel 等其他一些大型项目不同的方法。他们的starters也有 pom 依赖项以及自动配置代码。此外,这些启动器还依赖于其他内部启动器。
我的问题是 - 我们什么时候应该选择一种方法而不是另一种方法以及创建 Spring Boot 启动器的最佳方法是什么?一种相对于另一种的缺点/优点是什么?另外,为什么 spring boot 人们选择以他们所做的方式组织启动器,因为将 pom 依赖项和自动配置放在一起似乎是一种直观的方法?
最佳答案
这是一个非常好的问题,需要考虑不同的方面。
让我们从 Spring Boot 开始。我们不希望首发以任何方式成为强制性的。如果您想为“Web 应用程序”制作自己的启动器,或者您想自己列出依赖项(“webmvc”+您最喜欢的容器),那就这样吧。这是代码不在启动器中的主要原因,但不仅仅是如此。另一个原因是自动配置代码可用并且可以适应您添加的库。如果这是分开的,您需要添加库+“正确的”自动配置模块的组合。人们很容易忘记后者。
现在是第三方。我不能代表 Camel,但将自动配置代码与启动器分离可以归结为您自动配置的代码是否可以适应可选的依赖项。如果您的用例是关于自动配置库“acme”并且它没有任何可选功能,那么只拥有一个模块并使用它会更自然。如果您开始在启动器中添加可选依赖项,您可能需要重新考虑。
如果“acme”有多种风格、选项或可选功能,那么最好将自动配置分开。这使得其他人可以使用自动配置模块及其选项来制作自己的启动器。在你这边,你可以制作“一个启动器”来提供你想要推广的选项。有点像我们使用 spring-boot-starter-web
所做的,将 Tomcat 作为默认容器。
关于Spring Boot 启动器创建选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61350595/