स्प्रिंग ऑटोवायरिंग से उप-पैकेजों को छोड़ दें?


83

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

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

(क्यों? मैं अपने एकीकरण परीक्षणों से कुछ घटकों को बाहर करना चाहूंगा)

जवाबों:


85

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

 <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>

यह स्पष्ट है क्योंकि अब आप स्रोत कोड में ही दस्तावेज कर चुके हैं कि कक्षा को एकीकरण परीक्षणों के लिए एक आवेदन संदर्भ में शामिल करने का इरादा नहीं है।


बहिष्कृत-फ़िल्टर कार्यों का उपयोग करना लेकिन मुझे बचना नहीं था "।"
अमीन

2
@Amin शायद ऐसा इसलिए है क्योंकि "।" शाब्दिक सहित किसी भी चरित्र के लिए खाता "।"
aksh1618

54

मैं @ComponentScanउसी उपयोग के मामले के लिए निम्नानुसार उपयोग कर रहा हूं । यह BenSchro10 के XML उत्तर के समान है लेकिन यह एनोटेशन का उपयोग करता है। दोनों के साथ एक फिल्टर का उपयोग करें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);
    }
}

शायद यह विशुद्ध रूप से उदासीन है, लेकिन मैं वास्तव में अभी भी XML पसंद करता हूँ
Kirby

10
यह मेरे हो सकता है लेकिन वसंत 4.2 के साथ मैं उपयोग करने के लिए है FilterType.REGEXइस दृष्टिकोण के लिए
ThanksForAllTheFish

यह वही था जो मैं चाहता था, लेकिन मुझे भी उपयोग करना था FilterType.REGEX। हो सकता है कि उत्तर को प्रतिबिंबित करने के लिए अपडेट किया जा सके?
एडम

1
एक नया उत्तर देने के लिए स्वतंत्र महसूस करें
किर्बी

38

के लिए स्प्रिंग 4 मैं निम्नलिखित का उपयोग
(के रूप में प्रश्न 4 साल पुराना है और अधिक लोगों को वसंत 3.1 की तुलना में वसंत 4 का उपयोग मैं इसे पोस्ट कर रहा हूँ):

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

13

ऐसा लगता है कि आपने XML के माध्यम से ऐसा किया है, लेकिन यदि आप नए स्प्रिंग बेस्ट प्रैक्टिस में काम कर रहे हैं, तो आपका कॉन्फि़क्शन जावा में होगा, और आप उन्हें इस तरह से बाहर कर सकते हैं:

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

9
@JonathanW लेकिन फिर भी, एक Google खोज से इस पृष्ठ पर आने वाले लोगों के लिए वास्तव में उपयोगी उत्तर
स्टीवर्ट

12

यह स्प्रिंग 3.0.5 में काम करता है। इसलिए, मुझे लगता है कि यह 3.1 में काम करेगा

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

1
खबरदार कि यह मामले की स्थिति में बहिष्कार को नजरअंदाज कर देता है, वर्गपथ पर मौजूद नहीं है।
वडज़िम

7

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

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

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

यहां आपको और उदाहरण मिल सकते हैं: स्कैनिंग को अनुकूलित करने के लिए फ़िल्टर का उपयोग करना


धन्यवाद, सिद्धांत रूप में मैं refactoring के विचार से सहमत हूँ - यह मेरा पहला विचार था। दुर्भाग्य से, यह वास्तव में मेरी विशेष स्थिति के लिए एक बढ़िया विकल्प नहीं है।
होलीसामोसा

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

4

मेरे लिए काम करने वाली एक बात यह है:

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

या एक्सएमएल में:

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

यह डिफ़ॉल्ट को ओवरराइड करता है resourcePatternजो है "**/*.class"

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


2

आप @SpringBootApplication का भी उपयोग कर सकते हैं , जो कि स्प्रिंग डॉक्यूमेंटेशन के अनुसार निम्न तीन एनोटेशनों के समान कार्यक्षमता करता है: @ कॉनफिगरेशन , @EnableAutoConfiguration @ComponentScan एक एनोटेशन में।

@SpringBootApplication(exclude= {Foo.class})
public class MySpringConfiguration {}

जावाडोक के अनुसार, excludeके लिए है विशिष्ट ऑटो विन्यास वर्गों को शामिल न करें घटक स्कैन से, नहीं सभी वर्गों। यदि आप कोशिश करते हैं, तो आपको एक त्रुटि मिलेगी " निम्नलिखित वर्गों को बाहर नहीं किया जा सकता है क्योंकि वे ऑटो-कॉन्फ़िगरेशन कक्षाएं नहीं हैं "।
अभिजीत सरकार

1

आप विशिष्ट पैकेज को भी शामिल कर सकते हैं और उन्हें बाहर कर सकते हैं जैसे:

शामिल करें और बाहर करें (दोनों)

 @SpringBootApplication
        (
                scanBasePackages = {
                        "com.package1",
                        "com.package2"
                },
                exclude = {org.springframework.boot.sample.class}
        )

सिर्फ बाहर निकालें

@SpringBootApplication(exclude= {com.package1.class})
public class MySpringConfiguration {}

जावाडोक के अनुसार, excludeके लिए है विशिष्ट ऑटो विन्यास वर्गों को शामिल न करें घटक स्कैन से, नहीं सभी वर्गों। यदि आप कोशिश करते हैं, तो आपको एक त्रुटि मिलेगी " निम्नलिखित वर्गों को बाहर नहीं किया जा सकता है क्योंकि वे ऑटो-कॉन्फ़िगरेशन कक्षाएं नहीं हैं "।
अभिजीत सरकार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.