具有@Conditional的完全合格的班级名称

时间:2020-04-02 16:41:49

标签: java spring-boot

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

enter image description here

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

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

1 个答案:

答案 0 :(得分:2)

即使您的类路径上没有类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,...

只需调整您的部署/类路径,即可以其他方式配置软件。