@ComponentScan एनोटेशन का उपयोग करके कई रास्तों को कैसे स्कैन किया जाए?


89

मैं स्प्रिंग 3.1 का उपयोग कर रहा हूं @Configurationऔर @ComponentScanविशेषताओं और विशेषताओं का उपयोग करके एक एप्लिकेशन को बूटस्ट्रैप कर रहा हूं ।

वास्तविक शुरुआत इसके साथ की जाती है

new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);

इस कॉन्फ़िगरेशन वर्ग के साथ एनोटेट किया गया है

@Configuration
@ComponentScan("com.my.package")
public class MyRootConfigurationClass

और यह ठीक काम करता है। हालाँकि मैं उन पैकेजों के बारे में अधिक विशिष्ट होना चाहूंगा जिन्हें मैंने स्कैन किया था इसलिए मैंने कोशिश की।

@Configuration
@ComponentScan("com.my.package.first,com.my.package.second")
public class MyRootConfigurationClass

हालाँकि, यह मुझे बता रही त्रुटियों के साथ विफल है कि यह @Componentएनोटेशन का उपयोग करके निर्दिष्ट घटकों को नहीं पा सकता है ।

मैं जो कर रहा हूं उसके बाद करने का सही तरीका क्या है?

धन्यवाद


दो सही उत्तर उसी समय के बारे में दिए गए हैं जहाँ तक मैं बता सकता हूँ। मैं हग करने की स्वीकृति सिर्फ इसलिए दूंगा क्योंकि उसके पास कम अंक हैं, लेकिन आप दोनों को धन्यवाद।
प्रोग्रामिंग गाय

यदि आप कोटलिन संस्करण के लिए एक ही बात सोच रहे हैं, तो इस एक stackoverflow.com/a/62818187/7747942 की
सिलहेयर

जवाबों:


159

@ComponentScan इस तरह स्ट्रिंग सरणी का उपयोग करता है:

@ComponentScan({"com.my.package.first","com.my.package.second"})

जब आप केवल एक स्ट्रिंग में कई पैकेज नाम प्रदान करते हैं, तो स्प्रिंग इसे एक पैकेज नाम के रूप में व्याख्या करता है, और इस प्रकार यह नहीं मिल सकता है।


48

स्ट्रिंग के रूप में बेस-पैकेज स्थान निर्दिष्ट करने के लिए एक अन्य प्रकार-सुरक्षित विकल्प है। यहां एपीआई देखें , लेकिन मैंने नीचे भी चित्रित किया है:

@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})

BasePackageClasses का उपयोग करके आपके वर्ग के संदर्भों के साथ निर्दिष्ट करें स्प्रिंग उन पैकेजों को स्कैन करने के लिए बताएगा (जैसा कि उल्लेखित विकल्पों की तरह ), लेकिन यह विधि दोनों प्रकार की सुरक्षित है और IDE समर्थन जोड़ती है भविष्य के रीफैक्टरिंग के लिए है - मेरी पुस्तक में एक विशाल प्लस।

एपीआई से पढ़ना, स्प्रिंग का सुझाव है कि आप प्रत्येक पैकेज में एक नो-ऑप मार्कर वर्ग या इंटरफ़ेस बनाना चाहते हैं जो स्कैन करना चाहते हैं जो इस विशेषता के लिए / संदर्भ के रूप में उपयोग किए जाने के अलावा कोई अन्य उद्देश्य नहीं प्रदान करता है।

IMO, मुझे मार्कर-कक्षाएं पसंद नहीं हैं (लेकिन फिर से, वे पैकेज-इंफ़ॉर्मेशन वर्गों की तरह ही बहुत सुंदर हैं) लेकिन इस स्कैन के लिए शामिल करने के लिए आवश्यक प्रकार की सुरक्षा, आईडीई समर्थन, और आधार पैकेजों की संख्या को बहुत कम करना एक शक के साथ, एक बेहतर विकल्प है।


क्या कोई समझा सकता है कि क्यों @ComponentScan ({"com.app", "com.controllers"}) मेरे लिए काम नहीं करता है, लेकिन @ComponentScan (basePackageClasses = {"com.controllers"}} अच्छा काम नहीं करता है? मुझे यह हर क्लास का नाम लिखते हुए उबाऊ लगता है
xaverras

3
आपको पैकेज में केवल एक वर्ग निर्दिष्ट करना है, जिस पैकेज को आप स्कैन करना चाहते हैं। इसे मार्कर वर्ग के रूप में जाना जाता है। यदि आपको पदानुक्रम में उच्चतर पैकेज को स्कैन करने की आवश्यकता है जिसमें कोई वर्ग नहीं है, तो वसंत पैकेज "स्कैनिंग" के उद्देश्य से उस पैकेज में परिभाषित "स्प्रिंग मार्कर" इंटरफ़ेस या अंतिम वर्ग का उपयोग करके एक तकनीक का सुझाव देता है।
प्रॉनसर

17

अपना पैकेज नाम अलग से प्रदान करें, इसके String[]लिए पैकेज नामों की आवश्यकता होती है ।

इसके अलावा:

@ComponentScan("com.my.package.first,com.my.package.second")

इसे इस्तेमाल करो:

@ComponentScan({"com.my.package.first","com.my.package.second"})

10

ऐसा करने का एक अन्य तरीका basePackagesक्षेत्र का उपयोग करना है ; जो कि ComponentScan एनोटेशन के अंदर एक क्षेत्र है।

@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})

यदि आप ComponentScan एनोटेशन में देखें। जार फ़ाइल से .class में आपको एक BasePackages फ़ील्ड दिखाई देगी जो स्ट्रिंग्स की एक सरणी में ले जाती है।

public @interface ComponentScan {
String[] basePackages() default {};
}

या आप स्पष्ट रूप से कक्षाओं का उल्लेख कर सकते हैं। जो कक्षाओं की श्रेणी में आता है

Class<?>[]  basePackageClasses

4

आप कई पैकेजों का उपयोग करने के लिए ComponentScan का उपयोग करते हैं

@ComponentScan({"com.my.package.first","com.my.package.second"})


1

सुनिश्चित करें कि आपने इस निर्भरता को अपने pom.xml में जोड़ा है

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

आधे घंटे के करीब बिताने के बाद धन्यवाद यह गायब निर्भरता थी
DvixExtract

1

मैं उपयोग करता हूं:

@ComponentScan(basePackages = {"com.package1","com.package2","com.package3", "com.packagen"})

0

आप @ComponentScans एनोटेशन का भी उपयोग कर सकते हैं:

@ComponentScans(value = { @ComponentScan("com.my.package.first"),
                          @ComponentScan("com.my.package.second") })

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