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