【问题标题】:Fully qualified class name with @Conditional带有@Conditional 的完全限定类名
【发布时间】:2020-07-14 17:23:45
【问题描述】:

在有关 Spring Boot 和自动配置的课程视频中

它说如果我们不想在编译时依赖类对象,我们可以使用完全限定的类名 type = { "a.b.c.Foo" } 而不是 value = { Foo.class }

你能解释一下这是什么意思吗?

【问题讨论】:

  • Foo.class 暗示 import a.b.c.Foo;"a.b.c.Foo" 没有。 (注意引号的使用)

标签: java spring-boot


【解决方案1】:

使用type = { "a.b.c.Foo" } 将编译即使您的类路径上没有类a.b.c.Foo,而value = { a.b.c.Foo.class } 要求Foo 至少在编译时在您的类路径上。由于注释的性质,即使 a.b.c.Foo 在运行时的类路径中不存在,这两种变体也可以执行 - 至少在某些情况下:

@ConditionalOnClass.value的JavaDoc

由于这个注解是通过加载类字节码来解析的,所以在这里指定最终可能不在类路径上的类是安全的,只有当这个注解直接在受影响的组件上并且不是如果这个注释用作组合的元注释。要将此注释用作元注释,请仅使用 {@link #name} 属性。

一般来说,@ConditionalOnClass 注解可用于执行依赖于其他类的配置。

例如,您可以拥有不同的云存储配置 AWS、GCP 和 Azure。这些配置中的每一个都注册了一个CloudUpload bean。使用@ConditionalOnClass,您只执行当前有效的配置,即如果 AWS 开发工具包在类路径上,您配置 S3CloudUpload bean,...

这只是通过调整您的部署/类路径,您可以以不同的方式配置您的软件。

【讨论】:

    猜你喜欢
    • 2020-11-12
    • 2011-07-16
    • 2011-11-08
    • 1970-01-01
    • 2021-03-25
    • 2015-08-03
    • 2019-12-14
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多