为什么 spring-boot 将所有类保留在模块 'spring-boot-autoconfigure' 中



我注意到 spring-boot 将所有类都放在子模块org.springframework.boot:spring-boot-autoconfigure中,而其他子模块(如org.springframework.boot:spring-boot-starter-jdbc只是执行依赖项导入,而没有任何类。 我的问题是,为什么 spring-boot 不将 JDBC 自动配置类放入子模块spring-boot-starter-jdbc(其他子模块也是如此),这样代码会更有凝聚力。

如果 Spring Boot 这样做,如果有人决定直接将所需的依赖项添加到他们的pom.xml/build.gradle而不是使用入门模块,则自动配置将不可用。

编辑:由于评论部分呈指数级增长,我在这里回答OP的论点:

我认为这不是问题,实际上我们希望用户使用入门模块而不是所需的依赖项。

"我们"是谁?当然不是 Spring 开发人员,特别是考虑到启动器应该是一个起点,而不是自定义依赖项列表的替代品。例如,spring-boot-starter-jdbc 添加了对某些版本 HikariCP 的依赖 - 但是如果您更喜欢其他连接池实现或其他版本的 HikariCP,该怎么办?如果 JDBC 的自动配置类在启动器中,则必须配置排除或不使用自动配置。现在它的工作方式,您只需删除启动器并添加您喜欢的依赖项即可。

好的,谢谢回复,你说的很有道理。但是这还是有一些缺点,比如,如果我想使用 undertow,我可以导入 spring-boot-starter-web 并排除 spring-boot-starter-tomcat,并且我会导入 spring-boot-starter-undertow,那么当 spring-boot 升级到更新的版本时,如果 spring-boot-starter-web 导入一个新的依赖项,我也会有这个依赖项

任何和所有项目,无论使用哪种编程语言,都依赖于特定版本的库和框架,因此永远不会有一个或多个依赖项以某种方式神奇地自我升级并破坏项目代码的情况。此外,依赖项及其版本是在项目开始时选择的,不会经常更改,当然也不是每个新版本。最后,当切换依赖项或提出其版本时,它是在研究当前使用的版本和新版本之间的更改后完成的,因此没有人会因为突然需要一个以前不需要的库而停止软件工作的情况。

但是如果我按照你的方式这样做,我将无法获得由 spring-boot-starter-web 导入的新依赖项,也许我需要查看源代码并自己添加此依赖项。 而且一些开发人员不知道如何找出 spring-boot-starter-web 的依赖关系。弹簧启动的文档显示此排除演示:https://docs.spring.io/spring-boot/docs/1.5.14.RELEASE/reference/htmlsingle/#howto-use-undertow-instead-of-tomcat

首先,你不需要看代码 - 如果你想从其中一个 Spring Boot 启动器中添加所有依赖项,你需要做的就是在 search.maven.org 或 mvnrepository.com 或其他类似站点上找到它们,并检查它们具有哪些编译、可选和测试依赖项,并添加您需要的任何依赖项。

第二,没有。对不起,我不想听起来像个混蛋,但是当涉及到他们选择的编程语言时,所有软件开发人员和软件工程师都知道如何管理他们项目的依赖项并检查第三方库的依赖项,否则他们根本无法完成他们的工作。

第三,Spring Boot 启动器不包含任何代码 - 只包含依赖项,因此如果将依赖项添加到启动器中,则很可能不需要它来处理项目中的任何内容,如果将其添加到启动器的一个依赖项中,则当您在项目中提出该依赖项版本时,您将自动获得它(前提是您正确设置了依赖项管理)。

最新更新