संदर्भ में कई संकुल: घटक-स्कैन, स्प्रिंग कॉन्फिग


185

मैं context:component-scanतत्व में स्प्रिंग-सर्वलेट.एक्सएमएल फ़ाइल में कई पैकेज कैसे जोड़ सकता हूं ?

मैंने कोशिश की है

<context:component-scan base-package="z.y.z.service" base-package="x.y.z.controller" />

तथा

<context:component-scan base-package="x.y.z.service, x.y.z.controller" />

तथा

<context:component-scan base-package="x.y.z.service" />
<context:component-scan base-package="x.y.z.controller" />

लेकिन त्रुटि मिली:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [x.y.z.dao.daoservice.LoginDAO] found for dependency:

जवाबों:


271

निम्नलिखित दृष्टिकोण सही है:

<context:component-scan base-package="x.y.z.service, x.y.z.controller" /> 

ध्यान दें कि त्रुटि के बारे में शिकायत है x.y.z.dao.daoservice.LoginDAO, जो ऊपर वर्णित पैकेजों में नहीं है, शायद आप इसे जोड़ना भूल गए:

<context:component-scan base-package="x.y.z.service, x.y.z.controller, x.y.z.dao" /> 

5
यह उत्तर बताता है कि बेस-पैकेज BUT के सदस्यों के लिए पुनरावृत्ति नहीं है IS: stackoverflow.com/questions/7774295/… । मैं यह स्पष्ट करने के लिए उत्तर को थोड़ा बदलने का सुझाव दूंगा।
djangofan

52

एनोटेशन दृष्टिकोण

@ComponentScan({ "x.y.z", "x.y.z.dao" })

क्या हमें अनिवार्य रूप से विशिष्ट पैकेज जोड़ने की आवश्यकता है या यह उप पैकेजों को स्वचालित रूप से स्कैन कर सकता है यदि हम केवल शीर्ष स्तर के पैकेज को परिभाषित करते हैं?
निखिल साहू

@ निखिलसु नोप, यह एक पुनरावर्ती स्कैन (स्प्रिंग 3>) है
जीवविज्ञान.इन

अधिक जानकारी के लिए SO लिंक: stackoverflow.com/questions/10794587/…
dkb

43

आप कई आधार पैकेज जोड़ सकते हैं ( axtavt का उत्तर देखें ), लेकिन आप यह भी छान सकते हैं कि आधार पैकेज के अंदर क्या स्कैन किया गया है:

<context:component-scan base-package="x.y.z">
   <context:include-filter type="regex" expression="(service|controller)\..*"/>
</context:component-scan>

2
@ शम्स को मुझे सर करने की कोई आवश्यकता नहीं है, लेकिन यदि उत्तर सही है तो आपको इसे स्वीकार करना चाहिए (चेकमार्क पर क्लिक करें)
सीन पैट्रिक फ्लोयड

1
आप कई आधार पैकेज क्यों नहीं जोड़ सकते? उदाहरण के लिए "org.example, com.example"?
शेरविन असगरी


19
<context:component-scan base-package="x.y.z"/>

काम करेगा क्योंकि बाकी पैकेज "xyz" के उप पैकेज हैं। इस प्रकार, आपको व्यक्तिगत रूप से प्रत्येक पैकेज का उल्लेख करने की आवश्यकता नहीं है।


2
ठीक! शायद यह एक और कारण था, लेकिन यह सिर्फ मेरे लिए
पोर्ट्रेट के

@elcadro अन्य कारणों से होना चाहिए, क्योंकि यह अच्छी तरह से प्रलेखित और विज्ञापित फीचर है
eis

ठीक है, मैं इसके विपरीत नहीं कह सकता क्योंकि कई लोग मुझे सही कर रहे हैं। काश मैं पा सकता हूँ कि यह मेरे लिए काम क्यों नहीं किया ... वैसे भी धन्यवाद!
इलाकाड्रो

क्या यह एनोटेशन आधारित कॉन्फ़िगरेशन के लिए भी सही है?
निखिल साहू

6

एक अन्य सामान्य एनोटेशन दृष्टिकोण:

@ComponentScan(basePackages = {"x.y.z"})

2

यदि xyz आम पैकेज है तो आप उपयोग कर सकते हैं:

<context:component-scan base-package="x.y.z.*">

इसमें xyz के साथ शुरू होने वाले सभी पैकेज शामिल होंगे जैसे: xyzcontroller, xyzservice आदि।


1

उदाहरण के लिए आपके पास पैकेज "com.abc" है और आपके पास इसके अंदर कई पैकेज हैं, आप जैसे चाहें उपयोग कर सकते हैं

@ComponentScan("com.abc")

0

विलंबित प्रतिक्रिया लेकिन एनोटेशन आधारित दृष्टिकोण का उपयोग करके कई पैकेज देने के लिए हम नीचे के रूप में उपयोग कर सकते हैं:

@ComponentScan({"com.my.package.one","com.my.package.subpackage.two","com.your.package.supersubpackage.two"})

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.