itsource

@ComponentScan 주석을 사용하여 여러 경로를 스캔하려면 어떻게 해야 합니까?

mycopycode 2022. 11. 14. 21:40
반응형

@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은 이를 하나의 패키지 이름으로 해석하므로 찾을 수 없습니다.

베이스 패키지 위치를 String으로 지정하는 대신 타입 세이프가 있는 다른 방법이 있습니다.API를 참조해 주십시오.아래 그림도 참조해 주십시오.

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

클래스 레퍼런스와 함께 basePackageClasses 지정자를 사용하면 Spring에게 (상기된 다른 방법과 마찬가지로) 이러한 패키지를 스캔하도록 지시하지만, 이 방법은 타입 세이프하고 향후 리팩토링에 대한 IDE 지원을 추가합니다.이것은 제 생각에 큰 장점입니다.

API에서 읽어보면 Spring은 스캔을 원하는 각 패키지에 no-op 마커 클래스 또는 인터페이스를 만들 것을 제안합니다.이러한 마커는 이 속성을 참조하기 위한 목적으로만 사용됩니다.

IMO, 저는 마커 클래스를 좋아하지 않지만(그러나 패키지 정보 클래스와 거의 비슷합니다), 타입의 안전성, IDE 지원, 그리고 이 스캔에 필요한 베이스 패키지의 수를 대폭 줄이는 것은 의심의 여지 없이 훨씬 더 좋은 선택입니다.

패키지 이름을 별도로 지정하십시오.패키지 이름에는 가 필요합니다.

이것 대신:

@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를 보면 strings 배열을 포함하는 basePackages 필드가 나타납니다.

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

또는 클래스를 명시적으로 언급할 수도 있습니다.여러 개의 클래스가 있고

Class<?>[]  basePackageClasses

ComponentScan을 사용하여 여러 패키지를 검색하려면

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

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

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

이 의존관계가 pom.xml에 추가되었는지 확인합니다.

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

사용방법:

@ComponentScan(basePackages = {"com.package1","com.package2","com.package3", "com.packagen"})

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

반응형