Sử dụng Spring 3.X.X Tôi có 2 dịch vụ được chú thích bằng @Primary và tôi đã tạo một lớp cấu hình khác nơi tôi muốn sử dụng phiên bản "tùy chỉnh" của một trong các dịch vụ.Ghi đè cấu hình bean cài đặt cấu hình "Chính"
Vì lý do nào đó, tôi bỏ qua trong khi gỡ lỗi lớp cấu hình Tôi thấy rằng nó nhận được các phụ thuộc chính xác nhưng khi tôi muốn sử dụng nó, nó đã thiết lập sai.
Tôi tìm thấy nó dễ dàng hơn để giải thích với mã, đây là một ví dụ:
Interface Foo:
public interface Foo {
String getMessage();
}
thực hiện Tiểu học với một thông điệp mặc định hardcoded:
giao diện@Primary
@Service("FooImpl")
public class FooImpl implements Foo {
private String message = "fooDefaultMessage";
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Bar:
public interface Bar {
void doBar();
}
Thực hiện mặc định của thanh:
@Primary
@Service("BarImpl")
public class BarImpl implements Bar {
private Foo foo;
@Override
public void doBar() {
System.out.println(foo.getMessage());
}
public Foo getFoo() {
return foo;
}
@Autowired
public void setFoo(Foo foo) {
this.foo = foo;
}
}
Cho đến giờ rất tốt, nếu tôi muốn Tiêm một thanh, tôi sẽ nhận được mọi thứ như mong đợi. Thing là tôi có một cấu hình với những điều sau đây:
@Configuration
public class BeanConfiguration {
@Bean
@Qualifier("readOnlyFoo")
Foo readOnlyFoo() {
FooImpl foo = new FooImpl();
foo.setMessage("a read only message");
return foo;
}
@Bean
@Qualifier("readOnlyBar")
Bar readOnlyBar() {
BarImpl bar = new BarImpl();
bar.setFoo(readOnlyFoo());
return bar;
}
}
Khi tôi muốn tiêm một readOnlyBar tôi nhận được Foo mặc định thay vì một thiết lập ở đây.
private Bar readOnlyBar;
@Autowired
@Qualifier("readOnlyBar")
public void setReadOnlyBar(Bar readOnlyBar) {
this.readOnlyBar = readOnlyBar;
}
...
readOnlyBar.doBar();
Có đậu Foo với "fooDefaultMessage". Tại sao vậy? Làm cách nào để đảm bảo Spring sử dụng Bean I được đặt trên @Configuration?
Cảm ơn trước,
EDIT: Lưu ý rằng tương tự xảy ra nếu thay vì gọi phương thức ReadOnly() trong lớp @Configuration bạn vượt qua một đối số @Qualified. tức là:
@Configuration
public class BeanConfiguration {
@Bean
@Qualifier("readOnlyFoo")
Foo readOnlyFoo() {
FooImpl foo = new FooImpl();
foo.setMessage("a read only message");
return foo;
}
@Bean
@Qualifier("readOnlyBar")
Bar readOnlyBar(@Qualifier("readOnlyFoo") Foo readOnlyFoo) {
BarImpl bar = new BarImpl();
bar.setFoo(readOnlyFoo);
return bar;
}
}
Nếu thay vào đó, tôi thử sử dụng công cụ tiêm phụ thuộc vào Constructor, tôi không thể sử dụng.
bạn không thể sử dụng hồ sơ cho điều này? –
Bạn không chắc chắn cách cấu hình sẽ trợ giúp ở đây. Có, tôi có thể có một cấu hình bằng cách sử dụng các triển khai mặc định và một cấu hình khác trỏ đến các cấu hình chỉ đọc. Câu hỏi là làm thế nào để thiết lập chỉ đọc một instantiating mới (chỉ đọc) đậu từ mặc định. – void