복붙노트

[SPRING] Spring autowiring에서 서브 패키지를 제외 하시겠습니까?

SPRING

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

Spring 3.1에서 autowiring으로부터 package / sub-package를 제외시키는 간단한 방법이 있습니까?

예를 들어 com.example의 기본 패키지에 구성 요소 검사를 포함하려면 com.example.ignore를 제외하는 간단한 방법이 있습니까?

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

해결법

  1. ==============================

    1.를 사용하여 명시 적으로 패키지를 제외 할 수 있는지 확신 할 수 없지만 정규식 필터를 사용하면 효과적으로 얻을 수 있습니다.

    를 사용하여 명시 적으로 패키지를 제외 할 수 있는지 확신 할 수 없지만 정규식 필터를 사용하면 효과적으로 얻을 수 있습니다.

     <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>
    

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

  2. ==============================

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

    같은 사용 사례에 대해 다음과 같이 @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);
        }
    }
    
  3. ==============================

    3.Spring 4에서는 다음을 사용합니다. (질문을 4 세 이상으로 게시하고 더 많은 사람들이 Spring 3.1보다 Spring 4를 사용합니다).

    Spring 4에서는 다음을 사용합니다. (질문을 4 세 이상으로 게시하고 더 많은 사람들이 Spring 3.1보다 Spring 4를 사용합니다).

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

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

    이것은 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> 
    
  5. ==============================

    5.XML을 통해이 작업을 수행 한 것으로 보입니다. 그러나 새 Spring Best Practice에서 작업하는 경우 구성이 Java로되어 있으므로 제외 할 수 있습니다.

    XML을 통해이 작업을 수행 한 것으로 보입니다. 그러나 새 Spring Best Practice에서 작업하는 경우 구성이 Java로되어 있으므로 제외 할 수 있습니다.

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

    6.나는 당신이보다 편리한 계층 구조로 당신의 패키지를 리팩터링해야한다고 생각한다. 그래서 그것들은 기본 패키지 밖에있다.

    나는 당신이보다 편리한 계층 구조로 당신의 패키지를 리팩터링해야한다고 생각한다. 그래서 그것들은 기본 패키지 밖에있다.

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

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

    여기에 더 많은 예제가 있습니다. 필터를 사용하여 검색 사용자 정의

  7. ==============================

    7.나를 위해 작동하는 한 가지는 다음과 같습니다.

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

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

    또는 XML :

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

    이것에 의해, 디폴트의 resourcePattern가 "** / *. class"를 오버라이드 (override)합니다.

    이것은 resourcePattern이 항상 기본 패키지와 같고 상대적이기 때문에 기본 패키지 만 포함하는 가장 안전한 유형의 방법처럼 보일 것입니다.

  8. ==============================

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

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

    @SpringBootApplication(exclude= {Foo.class})
    public class MySpringConfiguration {}
    
  9. from https://stackoverflow.com/questions/10725192/exclude-subpackages-from-spring-autowiring by cc-by-sa and MIT license