2013-04-26 8 views
32

Tôi muốn chuyển đổi từ XML dựa trên cấu hình dựa trên Java trong Spring. Bây giờ chúng ta có một cái gì đó như thế này trong bối cảnh ứng dụng của chúng tôi:Lọc các gói cụ thể trong @ComponentScan

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

Nhưng nếu tôi viết một cái gì đó như thế này ...

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

... nó sẽ loại trừ các dịch vụ từ cả gói. Tôi có cảm giác mạnh mẽ tôi đang nhìn một cái gì đó xấu hổ tầm thường, nhưng tôi không thể tìm thấy một giải pháp để giới hạn phạm vi của bộ lọc để foo.bar.

Trả lời

38

Bạn chỉ cần tạo hai lớp Config, cho hai chú thích @ComponentScan mà bạn yêu cầu.

Vì vậy, ví dụ bạn sẽ có một Config lớp cho gói foo.bar của bạn:

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

và sau đó một Config lớp 2 cho gói foo.baz của bạn:

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

sau đó khi instantiating bối cảnh mùa xuân bạn sẽ làm như sau:

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

Cách khác là bạn có thể sử dụng chú thích @org.springframework.context.annotation.Import vào lớp Config đầu tiên để nhập lớp thứ hai Config. Vì vậy, ví dụ bạn có thể thay đổi FooBarConfig là:

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

Sau đó, bạn sẽ chỉ cần bắt đầu bối cảnh của bạn với:

new AnnotationConfigApplicationContext(FooBarConfig.class) 
+0

gì sẽ xảy ra cho 'Service.class'? – Deepen