2012-10-12 37 views
6

मैं @Autowired और @Service के पीछे की अवधारणा को समझने में सहायता की जरूरत से नहीं। मेरे पास @Service और @Autowired के साथ नियंत्रक के साथ परिभाषित एक डीएओ है और सब कुछ ठीक लगता है, हालांकि, मैं एक अलग वर्ग में उसी @Autowired का उपयोग करता हूं, तो यह काम नहीं करता है।@Autowired और @Service नियंत्रक से काम कर लेकिन एक अलग पैकेज

उदाहरण:

सेवा

@Service 
public class MyService { 
    private JdbcTemplate jdbcTemplate; 

    @Autowired 
    public void setDataSource (DataSource myDataSource) { 
     this.jdbcTemplate = new JdbcTemplate(myDataSource); 
    } 

    public void testUpdate(){ 
      jdbcTemplate.update("some query"); 
    } 
} 

नियंत्रक

package com.springtest.mywork.controller; 

@Controller 
@RequestMapping(value = "/test.html") 
public class MyController 
{ 
    @Autowired 
    MyService myService; 

    @RequestMapping(method = RequestMethod.GET) 
    public String test(Model model) 
    { 
    systemsService.testUpdate(); 
    return "view/test"; 
    } 
} 

उपरोक्त सभी ठीक काम करता है। हालांकि, अगर मैं पीओजेओ में MyService का उपयोग करना चाहता हूं तो यह काम नहीं करता है। उदाहरण:

package com.springtest.mywork.pojos; 
public class MyPojo { 

    @Autowired 
    MyService myService; 

    public void testFromPojo() { 
     myService.someDataAccessMethod(); //myService is still null 
    } 
} 

स्प्रिंग कॉन्फ़िग:

<beans> 
    <mvc:annotation-driven /> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
    <context:component-scan base-package="com.springtest.mywork" /> 
    <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb" /> 
     <property name="username" value="hello" /> 
     <property name="password" value="what" /> 
    </bean> 

    <bean name="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> 
     <constructor-arg ref="dataSource"/> 
    </bean> 
</beans> 
+0

है 'वसंत द्वारा instantiated MyPojo'? –

+0

मैंने config.xml में 'MyController' के लिए कुछ भी नहीं किया है इसलिए मैंने इसे' MyPojo 'के लिए नहीं किया है। मुझे क्या करना चाहिए? – birdy

+0

क्या आप अपनी स्प्रिंग कॉन्फ़िगरेशन पोस्ट कर सकते हैं? –

उत्तर

12

ऐसा इसलिए है क्योंकि आपकी पीओजेओ कक्षा वसंत कंटेनर द्वारा प्रबंधित नहीं की जाती है।

@Autowire एनोटेशन केवल उन वस्तुओं जो वसंत (यानी वसंत कंटेनर द्वारा बनाई गई) द्वारा प्रबंधित किया जाता काम करेंगे।

आपके मामले में सेवा और नियंत्रक वस्तु वसंत द्वारा प्रबंधित की जाती है, लेकिन आपकी पीओजेओ कक्षा वसंत द्वारा प्रबंधित नहीं होती है, यही कारण है कि @Autowire आपके द्वारा अपेक्षित व्यवहार का उत्पादन नहीं कर रहा है।

मैंने देखा कि एक और समस्या यह है कि आप डीएओ परत में @Service एनोटेशन का उपयोग कर रहे हैं, जब वसंत @Repository एनोटेशन विशेष रूप से इस उद्देश्य के लिए बनाया गया है।

यह भी वसंत POJO वर्गों का प्रबंधन करने के बाद सामान्य रूप से यह आंकड़ा भंडारण तत्व है जो कंटेनर के बाहर निर्मित होता है हो जाएगा अनुमति देने के लिए वांछनीय नहीं है।

क्या आप बता सकते POJO वर्ग के उद्देश्य और क्यों service उदाहरण उस में प्रयोग किया जाता है क्या?

+0

को दूर करने की आवश्यकता है, यह समझ में आता है। मैं '@ सेवा 'के बजाय' @ रिपोजिटरी' का उपयोग कर सकता हूं। मेरे pojo में मैं डेटाबेस को कुछ प्रश्न पूछना चाहता हूं। यही कारण है कि मैं अपने 'myService' का उपयोग करना चाहता हूं POJO। अगर कोई हो तो कृपया मुझे बताएं ऐसा करने के लिए रास्ता तय करें? मैं अपने POJO से करना चाहता हूं डीबी – birdy

+0

पर कुछ प्रश्न चलाता है POJO ऑब्जेक्ट इंस्टेंस कैसे बनाया जाता है? –

+0

नियंत्रक बस इस तरह pojo को तत्काल करता है: 'MyPojo पी = नया MyPojo(); p.testFromPojo(); ' – birdy

-1

अपने विन्यास फाइल में अपने संदर्भ घटक स्कैन जाँच

<context:component-scan base-package="<your_package>" /> 
+1

पर वसंत कॉन्फ़िगरेशन के साथ अपडेट किया गया मैंने इसे चेक किया है। यह सभी संकुल स्कैन कर रहा है। – birdy

2

शामिल applicationContext.xml में इस फ़ाइल

<context:annotation-config /> 
5

जब कक्षा का उपयोग कर वें स्कैनिंग, आपको वसंत में संवाद करना है जो कक्षाओं का प्रबंधन करने के लिए है। यह @Service एनोटेशन का उपयोग करके किया जाता है, और इसके संबंध (@Controller, @Repository, आदि)।

आप चुनेंगे, तो आपके सेम टिप्पणी करने के लिए नहीं, आप स्पष्ट रूप से यह आपके config में घोषित करना चाहिए, जैसा कि आप dataSource और jdbcTemplate के साथ किया था।

अपनी कक्षाओं टिप्पणी करना का मतलब केवल पैकेज स्प्रिंग द्वारा प्रबंधित किया जाता में उन वर्गों; जो आपको उस पैकेज में सभी कक्षाओं को प्रबंधित किए बिना पैकेज को स्कैन करने की अनुमति देता है।

+0

तो मुझे अपने POJO को '@ सेवा' या' @ रिपोजिटरी 'या' नियंत्रक 'के साथ एनोटेट करना चाहिए? – birdy

+0

मैं इसे xml – birdy

+0

में परिभाषित करने के बजाय एनोटेशन जोड़ना पसंद करूंगा "आपकी कक्षाओं को एनोटेट करने से प्रत्येक वर्ग को स्प्रिंग द्वारा प्रबंधित पैकेज में रोक दिया जाता है; ऐसा कुछ जो अक्सर वांछनीय नहीं होता है।" वास्तव में? तो एक पैकेज में केवल एक वर्ग एनोटेट किया जा सकता है? – birdy

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

  • कोई संबंधित समस्या नहीं^_^