Pertanyaan Filter paket khusus di @ComponentScan


Saya ingin beralih dari XML berbasis ke konfigurasi berbasis Java di Spring. Sekarang kami memiliki hal seperti ini dalam konteks aplikasi kami:

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

Tetapi jika saya menulis sesuatu seperti ini ...

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

... itu akan mengecualikan layanan dari kedua paket. Saya memiliki perasaan kuat bahwa saya mengabaikan sesuatu yang sepele, tetapi saya tidak dapat menemukan solusi untuk membatasi ruang lingkup filter foo.bar.


32
2018-04-26 13:46


asal


Jawaban:


Anda hanya perlu membuat dua Config kelas, untuk keduanya @ComponentScan anotasi yang Anda butuhkan.

Jadi misalnya Anda akan memilikinya Config kelas untuk Anda foo.bar paket:

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

lalu yang ke-2 Config kelas untuk Anda foo.baz paket:

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

kemudian ketika memulai musim semi Anda akan melakukan hal-hal berikut:

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

Alternatifnya adalah Anda bisa menggunakan @org.springframework.context.annotation.Import penjelasan pada yang pertama Config kelas untuk mengimpor ke-2 Config kelas. Jadi misalnya Anda bisa berubah FooBarConfig menjadi:

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

Maka Anda cukup memulai konteks dengan:

new AnnotationConfigApplicationContext(FooBarConfig.class)

38
2018-04-26 14:37