IT박스

@ComponentScan 주석을 사용하여 여러 경로를 스캔하는 방법은 무엇입니까?

itboxs 2020. 10. 18. 09:03
반응형

@ComponentScan 주석을 사용하여 여러 경로를 스캔하는 방법은 무엇입니까?


저는 Spring 3.1을 사용하고 @Configuration있으며 및 @ComponentScan속성을 사용하여 애플리케이션을 부트 스트랩하고 있습니다.

실제 시작은

new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);

이 구성 클래스는

@Configuration
@ComponentScan("com.my.package")
public class MyRootConfigurationClass

그리고 이것은 잘 작동합니다. 그러나 내가 스캔 한 패키지에 대해 좀 더 구체적으로 알고 싶습니다.

@Configuration
@ComponentScan("com.my.package.first,com.my.package.second")
public class MyRootConfigurationClass

그러나 이것은 @Component주석을 사용하여 지정된 구성 요소를 찾을 수 없다는 오류와 함께 실패합니다 .

내가 추구하는 일을하는 올바른 방법은 무엇입니까?

감사


@ComponentScan 은 다음과 같이 문자열 배열을 사용합니다.

@ComponentScan({"com.my.package.first","com.my.package.second"})

하나의 문자열로 여러 패키지 이름을 제공하면 Spring은 이것을 하나의 패키지 이름으로 해석하므로 찾을 수 없습니다.


기본 패키지 위치를 문자열로 지정하는 또 다른 유형 안전 대안 이 있습니다. 여기에서 API를 참조 하세요.

@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})

클래스 참조와 함께 basePackageClasses 지정자를 사용하면 Spring에 해당 패키지를 스캔하도록 지시 하지만 ( 언급 된 대안 처럼 )이 방법은 모두 형식에 안전 하며 향후 리팩토링을위한 IDE 지원추가합니다 .

API에서 읽은 Spring은이 속성에 대한 참조로 사용되는 것 외에 다른 목적이없는 스캔하려는 각 패키지에 no-op 마커 클래스 또는 인터페이스를 만들 것을 제안합니다.

IMO, 나는 마커 클래스를 좋아하지 않지만 (다시 말하지만 패키지 정보 클래스와 거의 비슷합니다) 유형 안전성, IDE 지원 및이 스캔에 포함해야하는 기본 패키지 수를 대폭 줄였습니다. 의심 할 여지없이 훨씬 더 나은 옵션입니다.


패키지 이름을 별도로 제공하십시오. 패키지 이름에는이 필요 String[]합니다.

대신 :

@ComponentScan("com.my.package.first,com.my.package.second")

이것을 사용하십시오 :

@ComponentScan({"com.my.package.first","com.my.package.second"})

이를 수행하는 또 다른 방법은 basePackages필드를 사용하는 것 입니다. ComponentScan 주석 내부의 필드입니다.

@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})

jar 파일에서 ComponentScan 주석 .class를 살펴보면 문자열 배열을받는 basePackages 필드를 볼 수 있습니다.

public @interface ComponentScan {
String[] basePackages() default {};
}

ComponentScan을 사용하여 다음을 사용하여 여러 패키지를 스캔합니다.

@ComponentScan({"com.my.package.first","com.my.package.second"})


이 종속성을 pom.xml에 추가했는지 확인하십시오.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

@ComponentScans 주석을 사용할 수도 있습니다.

@ComponentScans(value = { @ComponentScan("com.my.package.first"),
                          @ComponentScan("com.my.package.second") })

참고URL : https://stackoverflow.com/questions/10794587/how-to-scan-multiple-paths-using-the-componentscan-annotation

반응형