2013-04-12 19 views
11

Tôi có một lớp cấu hình java cung cấp fooBean trực tiếp và barBean bằng quét thành phần.Có cách nào để ghi đè lên một hạt được phát hiện bằng quét thành phần không?

@Configuration 
@ComponentScan(basePackages = { "com.blah" }) 
public class Config { 

    @Bean 
    public FooBean fooBean { 
     return new FooBean(); 
    } 
} 

và tôi muốn sử dụng lại nó trong các trường hợp thử nghiệm và tôi cần phải thay thế đậu với mocks:

@Configuration 
@Import(Config.class) 
public class TestConfig { 

    @Bean 
    public FooBean fooBean { 
     return new FooBeanMock(); 
    } 

    @Bean 
    public BarBean barBean { 
     return new BarBeanMock(); 
    } 
} 

(ở đây nó không có ý nghĩa nhiều để tái sử dụng Config, nhưng trong cuộc sống thực tôi có 1000 Đậu và tôi chỉ cần chế biến một ít)

Tại đây fooBean bị ghi đè, nhưng không phải là barBean.

Skipping loading bean definition for %s: a definition for bean " + "'%s' already exists. This is likely due to an override in XML. 

Ngoài ra còn có một vấn đề chính thức cho nó: https://jira.springsource.org/browse/SPR-9682

làm ai đó biết bất kỳ workaround để ghi đè lên một bean phát hiện bởi quét thành phần?

lưu ý rằng bean là mã kế thừa và không thể sửa đổi và KHÔNG có bộ định vị cho các phụ thuộc của nó (thuộc tính riêng + @Resource).

Trả lời

4

Cố gắng bỏ qua đậu không cần thiết:

@ComponentScan(basePackages = { "com.blah" }, excludeFilters = @Filter({UnnecessaryBean1.class, UnnecessaryBean2.class})) 
+0

tôi không thể bỏ qua chúng trong cấu hình chính. bởi vì tôi cần đậu và tôi không thấy bất kỳ khả năng nào để khởi tạo rằng bean khác vì "Có tính đến bean là mã kế thừa và không thể sửa đổi và KHÔNG có bộ định vị cho các phụ thuộc của nó (các thuộc tính riêng + @Resource). ". Trên cấu hình thử nghiệm đang nhập cấu hình chính, nó không có ý nghĩa gì, vì quá trình quét comp từ cấu hình chính đã nhập sẽ được thực hiện bằng cách nào đó. – mmoossen

+1

Có thể bạn có thể chia cấu hình chính thành hai phần: 1) quét thành phần 2) mọi thứ khác. Và sau đó chỉ nhập khẩu thứ hai trong cấu hình thử nghiệm của bạn. Vì vậy, bạn sẽ được ale ghi đè lên các thiết lập quét thành phần cho các bài kiểm tra. –

+0

có thể làm được. cảm ơn cho ý tưởng. Tôi sẽ thử nó. – mmoossen

0

Có bạn có thể ghi đè lên đậu được phát hiện bởi quét thành phần. Tôi làm điều này trong các trường hợp thử nghiệm. Tôi sử dụng cấu hình XML nhưng tôi nghĩ với Java Configuration sẽ rất giống nhau.

spring.xml:

<context:component-scan base-package="cz.backend"/> 

MyBeanImpl.java

@Component("myBean") 
public class MyBeanImpl implements MyBean { 
    //Something 
} 

Trong thư mục kiểm tra tôi có:

mùa xuân-test.xml:

<import resource="classpath:/spring.xml"/> 
<bean id="myBean" class="cz.backend.MyBeanTestMock"/> 

MyBeanTestMock.java:

public class MyBeanTestMock implements MyBean { 
    //Something 
} 

Tên của chồng ghi đè phải giống nhau.

+0

vấn đề là như mô tả sự kết hợp của thành phần-quét und xml-cấu hình rõ ràng. – mmoossen

+0

như bạn có thể thấy trong lỗi chính thức, nó đã được giải quyết và giải quyết trong phiên bản 4.2 – mmoossen

Các vấn đề liên quan