[SPRING] Spring autowiring에서 서브 패키지를 제외 하시겠습니까?
SPRINGSpring autowiring에서 서브 패키지를 제외 하시겠습니까?
Spring 3.1에서 autowiring으로부터 package / sub-package를 제외시키는 간단한 방법이 있습니까?
예를 들어 com.example의 기본 패키지에 구성 요소 검사를 포함하려면 com.example.ignore를 제외하는 간단한 방법이 있습니까?
(왜? 통합 테스트에서 일부 구성 요소를 제외하고 싶습니다.)
해결법
-
==============================
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.같은 사용 사례에 대해 다음과 같이 @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.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.이것은 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.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.나는 당신이보다 편리한 계층 구조로 당신의 패키지를 리팩터링해야한다고 생각한다. 그래서 그것들은 기본 패키지 밖에있다.
나는 당신이보다 편리한 계층 구조로 당신의 패키지를 리팩터링해야한다고 생각한다. 그래서 그것들은 기본 패키지 밖에있다.
그러나 이것을 할 수 없다면 다음을 시도하십시오.
<context:component-scan base-package="com.example"> ... <context:exclude-filter type="regex" expression="com\.example\.ignore.*"/> </context:component-scan>
여기에 더 많은 예제가 있습니다. 필터를 사용하여 검색 사용자 정의
-
==============================
7.나를 위해 작동하는 한 가지는 다음과 같습니다.
나를 위해 작동하는 한 가지는 다음과 같습니다.
@ComponentScan(basePackageClasses = {SomeTypeInYourPackage.class}, resourcePattern = "*.class")
또는 XML :
<context:component-scan base-package="com.example" resource-pattern="*.class"/>
이것에 의해, 디폴트의 resourcePattern가 "** / *. class"를 오버라이드 (override)합니다.
이것은 resourcePattern이 항상 기본 패키지와 같고 상대적이기 때문에 기본 패키지 만 포함하는 가장 안전한 유형의 방법처럼 보일 것입니다.
-
==============================
8.@SpringBootApplication을 사용할 수도 있습니다. Spring 설명서에 따르면 다음 세 가지 주석과 동일한 기능을 수행합니다. @Configuration, @EnableAutoConfiguration @ComponentScan 한 주석에.
@SpringBootApplication을 사용할 수도 있습니다. Spring 설명서에 따르면 다음 세 가지 주석과 동일한 기능을 수행합니다. @Configuration, @EnableAutoConfiguration @ComponentScan 한 주석에.
@SpringBootApplication(exclude= {Foo.class}) public class MySpringConfiguration {}
from https://stackoverflow.com/questions/10725192/exclude-subpackages-from-spring-autowiring by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 서블릿으로의 스프링 주입 (0) | 2018.12.17 |
---|---|
[SPRING] 내 applicationContext에 PropertyPlaceHolderConfigurer를 여러 개 가질 수 있습니까? (0) | 2018.12.17 |
[SPRING] 액세스 토큰을 발급 할 때 사용자 정보를 포함 할 수 있습니까? (0) | 2018.12.17 |
[SPRING] TaskExecutor 예제를 사용한 좋은 스프링 스레딩? [닫은] (0) | 2018.12.17 |
[SPRING] RestTemplate이 PagedResources에 응답 표현을 바인드하지 않는 이유는 무엇입니까? (0) | 2018.12.17 |