के साथ एक ही कक्षा का एक और बीन होता है, मैं xml कॉन्फ़िगरेशन फ़ाइल के माध्यम से उसी कक्षा के दो सेम बनाना चाहता हूं। कक्षा में वसंत द्वारा भरने के लिए एक एनोटेटेड सेटर है। बीन परिभाषाओं में से एक में मैं एनोटेशन से एक को ओवरराइड करने के लिए मैन्युअल रूप से मूल्य प्रदान करता हूं। लेकिन जब मैं ऐसा करता हूं, वसंत अब एनोटेशन वायरिंग को संभालता नहीं है।ऑटोवायरिंग तब नहीं होती है जब संपत्ति सेट के साथ मैन्युअल रूप से
यहाँ इस आशय का प्रदर्शन करने की एक न्यूनतम कोड है, सादगी के लिए @Value
इस्तेमाल किया, लेकिन यह @Autowired
के साथ एक ही है:
import org.springframework.beans.factory.annotation.Value;
import javax.annotation.PostConstruct;
public class AutowireTest {
public String testField;
@PostConstruct
public void init() {
if (testField == null)
throw new RuntimeException("FAIL");
}
@Value("default")
public void setTestField(String testField) {
this.testField = testField;
}
}
और वसंत config:
<bean id="au_test1" class="AutowireTest">
<property name="testField" value="manual"/>
</bean>
<bean id="au_test2" class="AutowireTest"/>
अगर मैं <property name="testField" value="manual"/>
, दोनों सेम को दूर "डिफ़ॉल्ट" प्राप्त करें। यदि यह दूसरा बीन अपवाद फेंकता है। मैंने वसंत कोड पर एक नज़र डाली और AutowiredAnnotationBeanPostProcessor
इंजेक्शन मेटाडाटा कैश का उपयोग कर रहा है जहां वर्ग इंजेक्शन मेटाडेटा के लिए कुंजी हैं जिसका मतलब है कि एक बीन के लिए विशेष संपत्ति को अन्य उदाहरणों के लिए ऑटोवॉयरिंग अक्षम करता है।
कोई विचार यह क्यों है? मैं एक समान प्रभाव कैसे प्राप्त कर सकता हूं जो आवश्यक रूप से स्ट्रिंग मानों के लिए काम नहीं कर रहा है बल्कि ऑब्जेक्ट सेम के लिए भी?
संपादित करें: मैं एक ऐसी संपत्ति चाहता हूं जहां कई मिलान करने वाले उम्मीदवार हों। एक को primary
के रूप में चिह्नित किया गया है। जब तक मैं एक्सएमएल के माध्यम से मैन्युअल रूप से उम्मीदवार निर्दिष्ट नहीं करता, मैं प्राथमिक वायर्ड को रखना चाहता हूं। मेरा मूल दृष्टिकोण इस संपत्ति के लिए @Autowired का उपयोग करना था, लेकिन चूंकि यह काम नहीं करता है, इसलिए मैं एक विकल्प की तलाश में हूं। किसी कारण से मैं बीन विरासत का उपयोग नहीं करना चाहता।
EDIT2: यदि मैं इन दो बीन परिभाषाओं को स्वैप करता हूं, तो समस्या नहीं होती है। पहली बार मैन्युअल ओवरराइड का पता चला है जब तक संपत्ति स्वचालित रूप से ठीक हो जाती है। इसका मतलब है कि यह एक इरादा विशेषता नहीं है क्योंकि इससे कुछ परियोजनाओं में बग का पता लगाने के लिए अजीब और कठिन हो सकता है, जिनकी अपेक्षाओं के अनुसार वायर्ड नहीं किया जा रहा है।
मुझे लगता है कि बेहतर प्रदर्शन प्रदान करने के लिए कार्यान्वयन इस तरह से है। –
मैंने इस मुद्दे को प्रदर्शित करने वाली एक न्यूनतम परियोजना के साथ वसंत जिरा में सबमिट किया है: https://jira.springsource.org/browse/SPR-9183 – mrembisz