2014-09-11 1 views
8

@ConditionalOnClass 주석은 정확히 어떻게 작동합니까?스프링 부트 @ConditionalOnClass는 어떻게 작동합니까?

내 목표는이 클래스를 제공하는 jar이 클래스 경로에 포함되어있는 경우에만 특정 bean을로드하는 것입니다.

I는 I가 @ConditionalOnClass(MyService.class)@Bean 주석과 옵션으로 받는다는에서 종속성을 선언 할 수 있지만 : 의존성 등

<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 그 콩이 자동으로 유선 얻어야한다. 그러나 종속성이없는 사람은 건너 뛰십시오. 그래서 아마 뭔가 잘못하고 있어요

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] 

: 나는 응용 프로그램을 시작할 때

는하지만, 나는 다음과 같은 오류가 발생합니다. 그런 다음 클래스 패스에있는 종속 항아리와 클래스에 조건부 bean을 어떻게 만들 수 있습니까?

스프링 문서에서

:

/** 
* The classes that must be present. Since this annotation parsed by loading class 
* bytecode it is safe to specify classes here that may ultimately not be on the 
* classpath. 
*/ 

그러나 오류가 다른 상태 ...

답변

10

좋은 캐치!

당신은 @Bean 메소드 레벨에서 사용할 수 있지만이 경우 당신은 문자 클래스를 지정해야합니다 : 나는 remeber하지 않는

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

이미 "왜"하지만 기존의 코드에서이다 스프링 부트 소스.

+1

최상위 클래스에 넣으면 수업 로딩 시간에 가져올 클래스를 제외하고 싶습니다. 그것은 수업을 사용할 때입니다. 이를 문자열 리터럴로 사용하면이 문제를 방지 할 수 있습니다. –

관련 문제