Spring autowiring에서 하위 패키지를 제외 하시겠습니까?


82

Spring 3.1의 autowiring에서 패키지 / 하위 패키지를 제외하는 간단한 방법이 있습니까?

예를 들어, 기본 패키지와 함께 구성 요소 스캔을 포함하려는 경우 com.example제외하는 간단한 방법이 com.example.ignore있습니까?

(왜? 통합 테스트에서 일부 구성 요소를 제외하고 싶습니다.)

답변:


84

<exclude-filter>를 사용하여 명시 적으로 패키지를 제외 할 수 있는지 확실하지 않지만 정규식 필터를 사용하면 효과적으로 얻을 수 있습니다.

 <context:component-scan base-package="com.example">
    <context:exclude-filter type="regex" expression="com\.example\.ignore\..*"/>
 </context:component-scan>

주석 기반으로 만들려면 통합 테스트에서 제외하려는 각 클래스에 @ com.example.annotation.ExcludedFromITests와 같은 주석을 달아야합니다. 그런 다음 구성 요소 스캔은 다음과 같습니다.

 <context:component-scan base-package="com.example">
    <context:exclude-filter type="annotation" expression="com.example.annotation.ExcludedFromITests"/>
 </context:component-scan>

이제 소스 코드 자체에 클래스가 통합 테스트를위한 애플리케이션 컨텍스트에 포함되지 않도록 문서화했기 때문에 더 명확합니다.


제외 필터를 사용하면 작동하지만 "."을 이스케이프 할 필요가 없습니다.
Amin

2
@Amin 아마도 "." 리터럴 "."을 포함한 모든 문자를 설명합니다.
aksh1618

54

@ComponentScan동일한 사용 사례에 대해 다음과 같이 사용 하고 있습니다. 이것은 BenSchro10의 XML 답변 과 동일 하지만 주석을 사용합니다. 둘 다 필터를 사용합니다.type=AspectJ

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration;
import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration;
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.example" },
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "com.example.ignore.*"))
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

어쩌면 그것은 순전히 향수,하지만 사실은 여전히 XML을 선호
커비

10
그것은 나를 수 있지만, 봄 4.2 내가 사용이 FilterType.REGEX이 방법에 대한
ThanksForAllTheFish

이것은 내가 원했던 것이지만 FilterType.REGEX. 아마도 이것을 반영하기 위해 답변을 업데이트 할 수 있습니까?
Adam

1
새 응답을 자유롭게
커비

37

를 들어 스프링 (4) 나는 다음을 사용
(질문 4 세이며, 더 많은 사람들이 봄 3.1보다 봄 4 사용할 때 내가 그것을 게시하고있다)

@Configuration
@ComponentScan(basePackages = "com.example", 
  excludeFilters = @Filter(type=FilterType.REGEX,pattern="com\\.example\\.ignore\\..*")) 
public class RootConfig {
    // ...
}

13

XML을 통해이 작업을 수행 한 것 같지만 새로운 Spring 모범 사례에서 작업하는 경우 구성은 Java로되어 있으므로 다음과 같이 제외 할 수 있습니다.

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "net.example.tool",
  excludeFilters = {@ComponentScan.Filter(
    type = FilterType.ASSIGNABLE_TYPE,
    value = {JPAConfiguration.class, SecurityConfig.class})
  })

9
그럼에도 불구하고 @JonathanW 그러나, Google 검색에서이 페이지에 오는 사람들에게 정말 유용한 답변
스튜어트

12

이것은 Spring 3.0.5에서 작동합니다. 그래서 3.1에서 작동 할 것이라고 생각합니다.

<context:component-scan base-package="com.example">  
    <context:exclude-filter type="aspectj" expression="com.example.dontscanme.*" />  
</context:component-scan> 

1
aspectj가 클래스 경로에없는 경우 자동으로 제외를 무시합니다.
Vadzim

7

패키지를 더 편리한 계층 구조로 리팩토링해야하므로 기본 패키지에서 제외됩니다.

그러나 이것을 할 수 없다면 다음을 시도하십시오.

<context:component-scan base-package="com.example">
    ...
    <context:exclude-filter type="regex" expression="com\.example\.ignore.*"/>
</context:component-scan>

여기에서 더 많은 예를 찾을 수 있습니다. 필터를 사용하여 스캔 사용자 지정


감사합니다. 원칙적으로 저는 리팩토링이라는 아이디어에 동의합니다. 이것이 저의 첫 번째 생각이었습니다. 불행히도 내 특정 상황에 맞는 좋은 옵션은 아닙니다.
HolySamosa

좋은 패키지 디자인은 이러한 상황을 피할 수 있지만 할 수 없다면 ... 하하하 할 수 없습니다. :)
richarbernal

4

나를 위해 일하는 것 한 가지는 다음과 같습니다.

@ComponentScan(basePackageClasses = {SomeTypeInYourPackage.class}, resourcePattern = "*.class")

또는 XML :

<context:component-scan base-package="com.example" resource-pattern="*.class"/>

이것은 기본값 resourcePattern"**/*.class".

resourcePattern은 항상 기본 패키지와 동일하고 상대적이므로 기본 패키지 만 포함하는 가장 안전한 방법 인 것 같습니다.


2

@SpringBootApplication 을 사용할 수도 있습니다. Spring 문서에 따르면 하나의 주석에서 @Configuration , @EnableAutoConfiguration @ComponentScan의 세 가지 주석과 동일한 기능을 수행합니다 .

@SpringBootApplication(exclude= {Foo.class})
public class MySpringConfiguration {}

Javadoc에 따르면 특정 자동 구성 클래스exclude제외하는 것입니다. 요소 스캔에서 모든 클래스가 아닌 입니다. 시도하면 " 다음 클래스는 자동 구성 클래스가 아니므로 제외 할 수 없습니다. "라는 오류 메시지 가 표시됩니다 .
Abhijit Sarkar

0

특정 패키지를 포함하고 다음과 같이 제외 할 수도 있습니다.

포함 및 제외 (둘 다)

 @SpringBootApplication
        (
                scanBasePackages = {
                        "com.package1",
                        "com.package2"
                },
                exclude = {org.springframework.boot.sample.class}
        )

그냥 제외

@SpringBootApplication(exclude= {com.package1.class})
public class MySpringConfiguration {}

Javadoc에 따르면 구성 요소 스캔에서 모든 클래스가 아닌 특정 자동 구성 클래스exclude제외하는 것 입니다. 시도하면 " 다음 클래스는 자동 구성 클래스가 아니므로 제외 할 수 없습니다. "라는 오류 메시지 가 표시됩니다 .
Abhijit Sarkar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.