例如,HttpEncodingAutoConfiguration带有@ConditionalOnClass(CharacterEncodingFilter.class)注释。

我对@ConditionalOnClass的了解是要在classpath中保证CharacterEncodingFilter,但是如果该类不在classpath中,那么它将如何在编译或加载类时通过。

非常感谢。

最佳答案

ConditionalOnClass.value上的javadoc给出了答案:


必须存在的类。由于此注释是由解析的
加载类字节码,在此处指定可能会安全的类
最终不位于类路径上,仅当此注释为
直接在受影响的组件上,如果使用此注释则不
作为组成的元注释。为了将此注释用作
元注释,仅使用name属性。


同样在编译时,您必须在类路径上具有此类,才能使用valueConditionalOnClass属性。

Spring-boot使用可选的依赖项来实现这一点。在Maven中,这看起来像这样:

<dependency>
  <groupId>com.atomikos</groupId>
  <artifactId>transactions-jdbc</artifactId>
  <version>4.0.4</version>
  <scope>compile</scope>
  <optional>true</optional>
</dependency>


在gradle中,通常使用compileOnly来实现。

关于spring-boot - SpringBoot @ConditionalOnClass如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47787538/

10-10 02:38