web-dev-qa-db-fra.com

Filtrer des packages spécifiques dans @ComponentScan

Je veux passer de XML basé à Java configuration basée sur Spring. Maintenant, nous avons quelque chose comme ça dans notre contexte d'application:

<context:component-scan base-package="foo.bar">
    <context:exclude-filter type="annotation" expression="o.s.s.Service"/>
</context:component-scan>
<context:component-scan base-package="foo.baz" />

Mais si j'écris quelque chose comme ça ...

 @ComponentScan(
    basePackages = {"foo.bar", "foo.baz"},
    excludeFilters = @ComponentScan.Filter(
       value= Service.class, 
       type = FilterType.ANNOTATION
    )
 )

... cela exclura les services des packages both. J'ai le fort sentiment que je néglige quelque chose de très embarrassant, mais je n'ai pas trouvé de solution pour limiter la portée du filtre à foo.bar.

35
Landei

Il vous suffit de créer deux classes Config, pour les deux @ComponentScan annotations dont vous avez besoin.

Par exemple, vous auriez une classe Config pour votre foo.bar paquet:

@Configuration
@ComponentScan(basePackages = {"foo.bar"}, 
    excludeFilters = @ComponentScan.Filter(value = Service.class, type = FilterType.ANNOTATION)
)
public class FooBarConfig {
}

puis une 2e classe Config pour votre foo.baz paquet:

@Configuration
@ComponentScan(basePackages = {"foo.baz"})
public class FooBazConfig {
}

puis lors de l'instanciation du contexte Spring, vous procéderiez comme suit:

new AnnotationConfigApplicationContext(FooBarConfig.class, FooBazConfig.class);

Une alternative est que vous pouvez utiliser le @org.springframework.context.annotation.Import annotation sur la première classe Config pour importer la 2e classe Config. Ainsi, par exemple, vous pouvez remplacer FooBarConfig par:

@Configuration
@ComponentScan(basePackages = {"foo.bar"}, 
    excludeFilters = @ComponentScan.Filter(value = Service.class, type = FilterType.ANNOTATION)
)
@Import(FooBazConfig.class)
public class FooBarConfig {
}

Ensuite, vous commenceriez simplement votre contexte avec:

new AnnotationConfigApplicationContext(FooBarConfig.class)
40
DB5