sourcecode

spring-boot @Conditional OnClass의 구조

copyscript 2023. 3. 10. 22:42
반응형

spring-boot @Conditional OnClass의 구조

정확히 어떻게@ConditionalOnClass주석 작업?

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

난 내가 주석을 달 수 있다고 생각했어@Bean와 함께@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그 콩을 자동으로 연결할 수 있기 때문입니다.하지만 의존관계가 없는 사람은 그것을 건너 뛰어야 한다.

그러나 앱을 시작할 때 다음과 같은 오류가 발생합니다.

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을 만들려면 어떻게 해야 합니까?

Spring Documents:

존재해야 하는 클래스.이 주석은 클래스 바이트 코드를 로드하여 구문 분석되므로 최종적으로 클래스 경로에 없을 수 있는 클래스를 여기서 지정하는 것이 안전합니다.

하지만 오류 상태가 다릅니다...

잘 잡았다!

에 사용할 수 있습니다.@Bean메서드 레벨이지만 이 경우 클래스를 String 리터럴로 지정해야 합니다.

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

"why"는 아직 기억나지 않지만 Spring Boot 소스의 기존 코드에서 가져온 것입니다.

이제 클래스 이름이 배열이기 때문에 곱슬곱슬한 브런치를 사용할 수 있습니다.

//org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
    @ConditionalOnClass({Jackson2ObjectMapperBuilder.class})
    static class JacksonObjectMapperConfiguration {
        JacksonObjectMapperConfiguration() {
        }

        @Bean
        @Primary
        @ConditionalOnMissingBean
        ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
            return builder.createXmlMapper(false).build();
        }
    }

언급URL : https://stackoverflow.com/questions/25789907/how-does-spring-boot-conditionalonclass-work

반응형