2012-05-23 9 views
52

¿Existe una manera simple de excluir un paquete/subpaquete del autoenlace en Spring 3.1?¿Excluye subpaquetes del autocorte de Spring?

Por ej., Si quisiera incluir un escaneo de componentes con un paquete base de com.example, ¿hay una manera simple de excluir com.example.ignore?

(¿Por qué? Me gustaría excluir algunos componentes de mis pruebas de integración)

Respuesta

64

No estoy seguro de que puede excluir explícitamente paquetes con un < excluir filtro >, pero apuesto utilizando un filtro de expresiones regulares habría efectivamente llegar hasta allí:

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

Para que sea a base de anotación, que había anotar cada clase que quería excluir para las pruebas de integración con algo como @ com.example.annotation.ExcludedFromITests. A continuación, el componente de exploración se vería así:

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

Eso es más claro porque ahora se ha documentado en el propio código fuente que la clase no está destinado a ser incluido en un contexto de aplicación para las pruebas de integración.

10

Esto funciona en la primavera 3.0.5. Por lo tanto, yo creo que funcionaría en 3,1

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

Tenga en cuenta que ignora silenciosamente la exclusión en caso de que aspectj no esté presente en classpath. – Vadzim

4

creo que debe refactorizar sus paquetes en la jerarquía más conveniente, por lo que están fuera del paquete base.

Pero si usted no puede hacer esto, trate de:

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

Aquí se puede encontrar más ejemplos: Using filters to customize scanning

+0

Gracias, en principio, estoy de acuerdo con la idea de refactorizar, fue mi primer pensamiento. Desafortunadamente, no es realmente una gran opción para mi situación particular. – HolySamosa

+0

Un buen diseño de paquete puede evitar estas situaciones, pero si no puede ... no puede, jaja :) – richarbernal

39

Estoy usando @ComponentScan de la siguiente manera para el mismo caso de uso. Esto es lo mismo que BenSchro10's respuesta XML pero esto usa anotaciones. Tanto el uso de un filtro con 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); 
    } 
} 
+0

Esta es la respuesta correcta 'moderna' –

+0

Quizás es puramente nostalgia, pero en realidad prefiero XML todavía – Kirby

+3

puede ser yo, pero con Spring 4.2 tengo que usar 'FilterType.REGEX' para este enfoque – ThanksForAllTheFish

3

Una cosa que parece funcionar para mí es la siguiente:

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

O en XML:

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

Esto anula el valor predeterminado resourcePattern que es "**/*.class" .

Esto parecería ser la forma más segura de incluir ÚNICAMENTE su paquete base, ya que ese resourcePattern siempre sería el mismo y relativo a su paquete base.

9

Parece que has hecho esto a través de XML, pero si estuviera trabajando en nuevas mejores prácticas de primavera, su configuración sería en Java, y que podría excluirlos como tan:

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

Aunque se da cuenta de que esta pregunta tiene más de 4 años de antigüedad y se le pidió específicamente para la primavera 3.1, ¿verdad? –

+1

@JonathanW Sin embargo, una respuesta realmente útil para las personas que vienen a esta página desde una búsqueda en Google – Stewart

11

Para primavera 4 Uso el siguiente
(Lo publico porque la pregunta tiene 4 años y más personas usan Spring 4 que Spring 3.1):

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

También puede utilizar @SpringBootApplication, que de acuerdo con la documentación que la primavera hace la misma funcionalidad que los siguientes tres anotaciones: @Configuration, @EnableAutoConfiguration@ComponentScan en una anotación.

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