2012-05-23 14 views
52

क्या स्प्रिंग 3.1 में ऑटोवॉयरिंग से पैकेज/सब-पैकेज को बाहर करने का कोई आसान तरीका है?स्प्रिंग ऑटोवॉयरिंग से उप-पैकेजों को बाहर निकालें?

उदा।, अगर मैं com.example के मूल पैकेज के साथ एक घटक स्कैन शामिल करना चाहता हूं तो com.example.ignore को बाहर करने का एक आसान तरीका है?

उत्तर

64

मुझे यकीन है कि आप एक < को बाहर फिल्टर के साथ स्पष्ट रूप से संकुल बाहर कर सकते हैं नहीं कर रहा हूँ >, लेकिन मैं एक regex फिल्टर का उपयोग कर शर्त को प्रभावी ढंग से आप वहां तक ​​पहुंचने होगा:

<context:component-scan base-package="com.example"> 
    <context:exclude-filter type="regex" expression="com\.example\.ignore\..*"/> 
</context:component-scan> 

यह एनोटेशन आधारित है, तो आप व्याख्या चाहते हैं बनाने के लिए प्रत्येक वर्ग जिसे आप एकीकरण परीक्षण के लिए बाहर रखा गया था जैसे @ com.example.annotation.ExcludedFromITests।

<context:component-scan base-package="com.example"> 
    <context:exclude-filter type="annotation" expression="com.example.annotation.ExcludedFromITests"/> 
</context:component-scan> 

कि स्पष्ट है, क्योंकि अब आप स्रोत कोड में ही उस वर्ग एकीकरण परीक्षणों के लिए एक आवेदन के संदर्भ में शामिल होने के लिए इरादा नहीं है में दर्ज कर लिया है: फिर घटक स्कैन कैसा दिखेगा।

10

यह वसंत 3.0.5 में काम करता है (क्यों? मैं अपने एकीकरण परीक्षण से कुछ घटकों बहिष्कृत करना चाहते हैं)। तो, मैं इसे 3,1

<context:component-scan base-package="com.example"> 
    <context:exclude-filter type="aspectj" expression="com.example.dontscanme.*" /> 
</context:component-scan> 
+0

सावधान रहें कि अगर स्पेसपाथ पर पहलू मौजूद नहीं है तो यह चुपचाप बहिष्कार को अनदेखा करता है। – Vadzim

4

में काम करेगा लगता होगा मुझे लगता है कि आप और अधिक सुविधाजनक पदानुक्रम में अपने संकुल refactor करना चाहिए, ताकि वे आधार पैकेज से बाहर हैं।

लेकिन अगर आप ऐसा नहीं कर सकते, कोशिश:

<context:component-scan base-package="com.example"> 
    ... 
    <context:exclude-filter type="regex" expression="com\.example\.ignore.*"/> 
</context:component-scan> 

यहाँ आप अधिक उदाहरण मिल सकता है: Using filters to customize scanning

+0

धन्यवाद, सिद्धांत रूप में मैं refactoring के विचार से सहमत हूं - यह मेरा पहला विचार था। दुर्भाग्य से, यह मेरी विशेष स्थिति के लिए वास्तव में एक अच्छा विकल्प नहीं है। – HolySamosa

+0

अच्छा पैकेज डिज़ाइन इस परिस्थितियों से बच सकता है, लेकिन यदि आप नहीं कर सकते ... आप हाहाहा नहीं कर सकते हैं, :) – richarbernal

39

मैं उसी उपयोग के मामले के लिए @ComponentScan का उपयोग कर रहा हूं। यह BenSchro10's एक्सएमएल उत्तर जैसा ही है लेकिन यह एनोटेशन का उपयोग करता है।

@ComponentScan(basePackageClasses = {SomeTypeInYourPackage.class}, resourcePattern = "*.class") 

या XML में:

<context:component-scan base-package="com.example" resource-pattern="*.class"/> 

यह डिफ़ॉल्ट resourcePattern जो "**/*.class" है ओवरराइड करता है दोनों के साथ type=AspectJ

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 
import org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration; 
import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration; 
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.FilterType; 
import org.springframework.context.annotation.ImportResource; 

@SpringBootApplication 
@EnableAutoConfiguration 
@ComponentScan(basePackages = { "com.example" }, 
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "com.example.ignore.*")) 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 
+0

यह सही 'आधुनिक' उत्तर –

+0

शायद यह पूरी तरह से नास्तिकता है, लेकिन मैं वास्तव में एक्सएमएल को अभी भी – Kirby

+3

पसंद कर सकता हूं मुझे रहो, लेकिन स्प्रिंग 4.2 के साथ मुझे इस दृष्टिकोण के लिए 'FilterType.REGEX' का उपयोग करना होगा – ThanksForAllTheFish

3

एक बात मेरे लिए काम करने लगता है कि एक फिल्टर का उपयोग यह है ।

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

9

ऐसा लगता है आप एक्सएमएल के माध्यम से इस किया है, लेकिन अगर आप नए वसंत सबसे अच्छा अभ्यास में काम कर रहे थे, अपने config जावा में होगा, और आप के रूप में इसलिए उन्हें बाहर कर सकते हैं:

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "net.example.tool", 
    excludeFilters = {@ComponentScan.Filter(
    type = FilterType.ASSIGNABLE_TYPE, 
    value = {JPAConfiguration.class, SecurityConfig.class}) 
    }) 
+0

हालांकि आपको पता है कि यह प्रश्न 4 साल से अधिक पुराना है और विशेष रूप से स्प्रिंग 3.1 के लिए पूछा गया था, है ना? –

+1

@ जोनाथन डब्ल्यू लेकिन फिर भी, Google खोज से इस पृष्ठ पर आने वाले लोगों के लिए वास्तव में उपयोगी उत्तर – Stewart

11

वसंत के लिए 4 मैं निम्नलिखित
का उपयोग करता हूं (मैं इसे पोस्ट कर रहा हूं क्योंकि प्रश्न 4 साल पुराना है और अधिक लोग स्प्रिंग 3 की तुलना में स्प्रिंग 4 का उपयोग करते हैं।1): एक टिप्पणी में @Configuration, @EnableAutoConfiguration@ComponentScan :

@Configuration 
@ComponentScan(basePackages = "com.example", 
    excludeFilters = @Filter(type=FilterType.REGEX,pattern="com\\.example\\.ignore\\..*")) 
public class RootConfig { 
    // ... 
} 
2

तुम भी @SpringBootApplication, जो वसंत प्रलेखन के अनुसार निम्नलिखित तीन टिप्पणी के रूप में ही कार्यक्षमता करता है का उपयोग कर सकते हैं।

@SpringBootApplication(exclude= {Foo.class}) 
public class MySpringConfiguration {} 
संबंधित मुद्दे