2012-07-17 8 views
7

के साथ एक स्प्रिंग बीन क्लास को परिभाषित करना चाहता हूं मेरे पास एक वसंत बीन है जो HibernateDaoSupport फैलाता है। मैं चाहता हूं कि यह बीन मेरे नियंत्रकों में इंजेक्शन दे, लेकिन मैं नहीं चाहता कि यह किसी भी इंटरफ़ेस को कार्यान्वित करे। मैं सिर्फ अपने शेष कोड के भीतर से कंक्रीट क्लास को संदर्भित करना चाहता हूं (शायद एपप्रोक्सी का उपयोग न करें?) क्या किसी के पास ऐसा करने का कोई तरीका है?मैं कोई इंटरफ़ेस

<bean id="mySampleService" class="com.sample.MySampleService"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

@Autowired 
private MySampleService mySampleService; 

... getters and setters .... 

मैं जानता हूँ कि यह एक अच्छा विचार इंटरफेस का उपयोग करने है और कहा कि आईओसी के पूरे मुद्दे है, लेकिन कृपया सुझाव है कि नहीं मैं इंटरफ़ेस का उपयोग।

+0

समस्या क्या है? – axtavt

+0

वर्तमान में आप इंटरफ़ेस का उपयोग करने के लिए मजबूर क्या कर रहे हैं? –

+0

गुड प्वाइंट एक्स्टाव (और एडम) - यह एक java.lang.ClassNotFoundException देता है: MySampleService, लेकिन कक्षा बिल्कुल बिल्कुल है। यह केवल तब ही देना शुरू कर दिया जब मैंने अपनी परियोजना से संबंधित "MySampleInterface" हटा दिया .... – fandang

उत्तर

10

वर्ग (आपके मामले में लेन-देन संबंधी प्रॉक्सी द्वारा) प्रॉक्सी किया करने के लिए यदि किसी भी इंटरफेस (InitializingBean अपने मामले में HibernateDaoSupport द्वारा कार्यान्वित) को लागू करता है, डिफ़ॉल्ट रूप से वसंत JDK गतिशील प्रॉक्सी के आधार पर प्रॉक्सी रणनीति का उपयोग करता है।

तो, यह InitializingBean प्रकार का प्रॉक्सी बनाता है, जाहिर है, MySampleService प्रकार के क्षेत्र में इंजेक्शन नहीं दिया जा सकता है।

यदि आप इंटरफ़ेस का उपयोग नहीं करना चाहते हैं तो आप <tx:annotation-driven> को proxy-target-class = "true" के साथ घोषित करके लेनदेन संबंधी पहलू द्वारा उपयोग की जाने वाली रणनीति को ओवरराइड कर सकते हैं।

यह भी देखें:

+2

भी, कंक्रीट वर्ग फाइनल मत बनाओ, या आप इसे इस तरह से प्रॉक्सी करने में सक्षम नहीं होंगे। – Matt

+1

axtavt धन्यवाद, यह काम करता है :) बीन अब वहां है और शून्य नहीं है, ठीक वही है जो मैं चाहता था, कभी यह पता नहीं लगाया जाएगा कि टीएक्स: एनोटेशन विशेषता इतनी धन्यवाद! – fandang

+0

और सुनिश्चित करें कि इसमें अल्फ [यहां] (http://stackoverflow.com/questions/8922135/why-always-have-single-implementaion-interfaces-in-service-and-dao-layers द्वारा उल्लिखित एक खाली कन्स्ट्रक्टर है) –

0

निम्नलिखित जांचें। सुनिश्चित करें कि आपके क्लासपाथ पर CGLIB है।

http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch08s06.html

+0

क्लासपाथ ठीक है, क्योंकि मैंने कहा, यह सब इंटरफेस को हटाने से पहले काम किया .... पहले काम नहीं कर सका बिना cglib .... – fandang

0

आप एक्सएमएल में मैप नियंत्रक सेम के रूप में है, तो आप इंटरफेस लिखने की जरूरत नहीं है सहित सब कुछ लिख सकते हैं। अन्यथा, एनोटेशन का उपयोग करने के साथ आपको प्रॉक्सी करने के लिए इंटरफेस बनाने की आवश्यकता है।

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