स्प्रिंग 3.X.X का उपयोग कर रहा है। मेरे पास @ प्राइमरी के साथ एनोटेटेड 2 सेवाएं हैं और मैंने एक और कॉन्फ़िगरेशन क्लास बनाया है जहां मैं सेवाओं में से एक के "अनुकूलित" संस्करण का उपयोग करना चाहता हूं।स्प्रिंग ओवरराइड बीन कॉन्फ़िगरेशन इसकी "प्राथमिक" एक
किसी कारण से मैं कॉन्फ़िगरेशन क्लास को डिबग करते समय अनदेखा करता हूं, मुझे लगता है कि यह सही निर्भरता प्राप्त करता है लेकिन जब मैं इसका उपयोग करना चाहता हूं तो उसने गलत सेट अप किया है।
मैं यह आसान कोड के साथ व्याख्या करने के लिए मिल जाए, यहाँ एक उदाहरण है:
इंटरफ़ेस फू:
@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;
}
}
बार इंटरफ़ेस:
public interface Foo {
String getMessage();
}
एक डिफ़ॉल्ट संदेश hardcoded साथ प्राथमिक कार्यान्वयन:
public interface Bar {
void doBar();
}
,210
बार डिफ़ॉल्ट कार्यान्वयन:
@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;
}
}
अब तक तो अच्छा, मुझे लगता है मैं सब कुछ प्राप्त की उम्मीद के रूप में एक बार सम्मिलित करें करना चाहते हैं।
@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;
}
}
जब मैं एक readOnlyBar इंजेक्षन करना चाहते हैं मैं डिफ़ॉल्ट फू के बजाय यहां सेट एक हो रही है: बात मैं निम्नलिखित के साथ एक विन्यास है।
private Bar readOnlyBar;
@Autowired
@Qualifier("readOnlyBar")
public void setReadOnlyBar(Bar readOnlyBar) {
this.readOnlyBar = readOnlyBar;
}
...
readOnlyBar.doBar();
"fooDefaultMessage" के साथ फू बीन है। ऐसा क्यों है? मैं कैसे सुनिश्चित कर सकता हूं कि स्प्रिंग @ कॉन्फ़िगरेशन पर सेट बीन का उपयोग करता है?
अग्रिम धन्यवाद,
संपादित करें: नोट है कि एक ही है, तो बजाय @Configuration कक्षा में केवल पढ़ने के लिए() विधि को बुलाने की क्या होता है जब आप एक @Qualified तर्क गुजरती हैं। यानी .:
@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;
}
}
, तो इसके बजाय मैं निर्माता निर्भरता इंजेक्शन सब कुछ का उपयोग कर की कोशिश काम करता है के रूप में मैं चाहता हूँ/उम्मीद लेकिन दुर्भाग्य से मुझे लगता है कि उपयोग नहीं कर सकते।
आप इस के लिए प्रोफ़ाइल का उपयोग नहीं कर सकते? –
यह सुनिश्चित नहीं है कि प्रोफाइल यहां कैसे मदद करेंगे। हां, मेरे पास डिफ़ॉल्ट कार्यान्वयन का उपयोग करके एक प्रोफ़ाइल हो सकती है और दूसरा जो केवल पढ़ने के लिए इंगित करता है। प्रश्न यह है कि डिफ़ॉल्ट रूप से केवल एक त्वरित (केवल पढ़ने के लिए) बीन्स को पढ़ने के लिए सेट करें। – void