2015-03-08 10 views
7

मुझे सेवा कक्षा के @Autowired ठोस कार्यान्वयन द्वारा इंजेक्ट करने की आवश्यकता है।वसंत - कंक्रीट इंटरफ़ेस कार्यान्वयन कैसे इंजेक्ट करें?

सेवा इंटरफ़ेस:

public interface PostService { 
... 
} 

कार्यान्वयन:

@Service("postServiceImpl") 
public class PostServiceImpl implements PostService { 
... 
} 

सेवा में तरीके @ लेन-देन संबंधी टिप्पणी के साथ कर रहे हैं

और अब मैं अपने नियंत्रक को postServiceImpl इंजेक्षन करना चाहते हैं - क्योंकि मैं की जरूरत है कार्यान्वयन से एक विधि का उपयोग करने, कि इंटरफ़ेस में नहीं है:

@Autowired 
@Qualifier("postServiceImpl") 
private PostServiceImpl postService; 

मैं NoSuchBeanDefinitionException प्राप्त निम्न संदेश के साथ:

के प्रकार [(...) .PostServiceImpl] निर्भरता के लिए मिला कोई योग्यता सेम: उम्मीद कम से कम 1 सेम जो autowire के रूप में उत्तीर्ण इस निर्भरता के लिए उम्मीदवार।

जब मैं अपने नियंत्रक में क्षेत्र बदलने के लिए:

private PostService postService 

यह काम करता है, लेकिन मैं PostServiceImpl से एक विशिष्ट विधि का उपयोग नहीं कर सकते हैं।

+3

तब इंटरफेस में जोड़ें। यदि आप कंक्रीट प्रकार इंजेक्ट करते हैं तो इंटरफेस घोषित करने का क्या मतलब है? –

+0

क्या आपके पास उस बीन पर कुछ पहलू लागू किए गए हैं? या प्रॉक्सी इंटरफेस आधारित? – fcracker79

+1

@ fcracker79 मुझे लगता है कि मेरे पास है, क्योंकि सेवा में विधियां @ लेनदेन संबंधी एनोटेशन के साथ हैं। – tomdavies

उत्तर

9

अपने तरीके से @Transactional एनोटेट, वसंत कार्यावधि में प्रॉक्सी पैदा करेगा, लेनदेन प्रबंधन कोड इंजेक्षन करने के लिए। डिफ़ॉल्ट वसंत तक प्रॉक्सी तंत्र है, जो इंटरफेस के आधार पर प्रॉक्सी के लिए JDK गतिशील प्रॉक्सी उपयोग करता है।

तो, इस मामले में, वसंत एक और कक्षा बनाता है जो PostService इंटरफेस लागू करता है, और उस वर्ग के बीन बनाता है। निश्चित रूप से PostServiceImpl पर स्वायत्त नहीं किया जा सकता है, क्योंकि वे भाई बहन हैं। हालांकि, अगर आप वास्तव में वर्ग पर autowire करना चाहते हैं, तो आप वसंत CGLib प्रॉक्सी के बजाय, जो उपवर्गीकरण उपयोग करने वाली प्रॉक्सी उपयोग करने के लिए मजबूर कर सकते हैं। आप अपने @EnableTransactionManagement एनोटेशन में proxyTargetClass=true सेट करते समय आप जावा आधारित config उपयोग कर रहे हैं द्वारा कर सकते हैं यही कारण है कि।

संबंधित मुद्दे