java - springbootconfiguration - springbootapplication exclude



spring-boot @ConditionalOnClassはどのように機能しますか? (1)

@ConditionalOnClassアノテーションはどの程度正確に機能しますか?

私の目標は、このクラスを提供するjarファイルがクラスパスに含まれている場合にのみ特定のBeanをロードすることです。

私は@ConditionalOnClass(MyService.class)@ConditionalOnClass(MyService.class)アノテーションを付け、mavenで依存関係をオプションとして宣言できると思いました。

<dependency>
    <groupId>de.my</groupId>
    <artifactId>my-framework<artifactId>
    <optional>true</optional>
</dependency>

@Bean
@ConditionalOnClass(MyService.class)
public MyConditionalBean statistics() {
    return new MyConditionalBean();
}

さて、依存関係としてmy-frameworkを持っmy-framework人は誰でも自動的にそのbeanを取得するはずです。 しかし、依存関係を持たない人は誰でもスキップすべきです。

しかし、アプリを起動すると、次のようなエラーが表示されます。

Caused by: java.lang.ClassNotFoundException: de.MyService.class
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702) ~[catalina.jar:7.0.50]
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) ~[catalina.jar:7.0.50]

だから私はおそらく何か悪いことをしている。 次に、依存関係jarとクラスパスに含まれるクラスを条件としたBeanを作成する方法を教えてください。

春のドキュメントから:

存在しなければならないクラス。 このアノテーションはクラスのバイトコードをロードすることによってパースされるので、ここでクラスを指定するのは安全です。

しかし、エラーは異なっています...


キャッチ!

@Beanメソッドレベルで使用できますが、その場合はクラスをリテラルとして指定する必要があります。

@Bean
@ConditionalOnClass(name ="de.MyService")
public MyConditionalBean statistics() {
    return new MyConditionalBean();
}

私はすでに「なぜ」を覚えていませんが、それはSpring Bootのソースの既存のコードからのものです。





spring-boot