【问题标题】:Purpose of SpringBoot import, then exclude pattern? [duplicate]SpringBoot导入的目的,然后排除模式? [复制]
【发布时间】:2018-11-15 22:13:40
【问题描述】:

我对 Java 比较陌生,作为一名 JS 开发人员,正在开发一个 SpringBoot 应用程序,我看到一个模式让我的好奇心达到顶峰:

Application.java 中有几个import 类,然后在@SpringBootApplication 中标记为exclude,例如

import org.springframework.boot.autoconfigure.data.database.DataBaseAutoConfiguration;
...
@SpringBootApplication(
    exclude = {DataBaseAutoConfiguration.class, ...}
)

DataBaseAutoConfiguration 在代码库中的任何其他地方都没有被引用,除了这里。

有人可以解释这种模式的目的吗?感觉很奇怪import这个类然后立即在配置中exclude

为什么没有类似的东西:

exclude = {"DataBaseAutoConfiguration", ...} 然后在 Spring 中查找要忽略的类,避免明显的“无用”导入?

或:

// import nothing
@SpringBootApplication

【问题讨论】:

  • “Java 文件中 import 语句的含义”是题外话,对这个问题没有帮助
  • 请澄清。如果您了解import 的作用,您是否只是在问SpringBootApplicationexclude 元素的作用?
  • exclude 的类型是 Class[],因此它需要 Class 值,而不是您建议的 String 值。有一个excludeName 需要一个String[],但您需要提供完全限定的类型名称,所以excludeName = {"org.springframework.boot.autoconfigure.data.database.DataBaseAutoConfiguration"}。使用 Class 字面量可以使这种类型更加安全。
  • 我知道 import 的工作原理,以及 exclude 的工作原理。问题更多的是两者如何互动,感觉就像import thing...unimport thing 并且脱颖而出
  • import 除了让您使用类的简单名称外没有任何作用。您很可能拥有exclude = {org.springframework.boot.autoconfigure.data.database.DataBaseAutoConfiguration.class} 而没有import 声明。语言特征与某些注释的元素完全无关。

标签: java spring-boot


【解决方案1】:

tl;dr import 是 Java 语言功能,exclude 是 Spring Boot 功能。

您必须import 类才能在您的代码中引用它们。在这种情况下,exclude 特定于 Spring Boot,它只是指示 spring 上下文不要触发 DataBaseAutoConfiguration 内的任何配置 bean。从技术上讲,exclude@SpringBootApplication 注释内的一个字段。

仅需要导入,因此您可以在代码中引用DataBaseAutoConfiguration。如果没有导入,你会得到一个编译错误。

【讨论】:

  • 我之所以问,是因为对DataBaseAutoConfiguration 的唯一引用是在import/exclude 中。如果 DataBaseAutoConfiguration 没有在其他任何地方使用,为什么要使用 import/exclude
  • 如果您删除了exclude = {DataBaseAutoConfiguration.class, ...},那么是的,您不需要导入语句。但这也意味着您的应用程序将从DataBaseAutoConfiguration 加载所有配置/bean,这对于这个特定的应用程序可能并不理想(即,如果您有自己的自定义数据库配置类来处理数据源的创建等)。
  • 这是因为 Spring 会尝试调用 DataBaseAutoConfiguration,即使它没有在代码中再次引用。在这种情况下,它被导入,以便在这里引用并告诉 Spring 在 Spring 中出现时忽略它?
  • 换一种说法:您需要导入只是为了让编译器和 JVM 能够找到 DataBaseAutoConfiguration 类的定义以在您的代码中使用。如果编译器和 JVM 甚至不知道如何加载它,你就不能告诉 Spring Boot 排除该类。
  • 正确:大概 DataBaseAutoConfiguration 被标记为 @Configuration 所以如果没有排除,Spring 会扫描它并从中加载任何 bean 和配置。
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2018-03-01
相关资源
最近更新 更多