Spring自動配線からサブパッケージを除外しますか?


82

Spring 3.1でパッケージ/サブパッケージを自動配線から除外する簡単な方法はありますか?

たとえば、の基本パッケージにコンポーネントスキャンを含めたい場合com.example、除外する簡単な方法はありcom.example.ignoreますか?

(なぜですか?統合テストから一部のコンポーネントを除外したいのですが)

回答:


84

<exclude-filter>を使用してパッケージを明示的に除外できるかどうかはわかりませんが、正規表現フィルターを使用すると効果的にそこに到達できると思います。

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

クラスが統合テストのアプリケーションコンテキストに含まれることを意図していないことをソースコード自体に文書化したので、これはより明確です。


exclude-filterの使用は機能しますが、「。」をエスケープする必要はありませんでした。
アミン

2
@アミンそれはおそらく「。」リテラル「。」を含むすべての文字を説明します。
aksh16 1819

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
それは私かもしれませんが、Spring 4.2ではFilterType.REGEXこのアプローチに使用する必要があります
ThanksForAllTheFish 2016

これは私が欲しかったものでしたが、私も使用しなければなりませんでしたFilterType.REGEX。たぶん、これを反映するように答えを更新することができますか?
アダム

1
新しい答えを自由に作ってください
カービー

37

以下のために春4私は、次の使用
(質問は4歳と私はそれを掲示していますし、より多くの人々が春3.1より春4を使用します):

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

13

XMLを介してこれを行ったようですが、新しいSpringのベストプラクティスで作業している場合、構成はJavaで行われるため、次のように除外できます。

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

9
@JonathanWしかし、それにもかかわらず、グーグル検索からこのページにアクセスする人々にとって本当に有用な答え
スチュワート

12

これはSpring3.0.5で機能します。だから、私はそれが3.1で動作すると思います

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

1
アスペクトjがクラスパスに存在しない場合、除外を黙って無視することに注意してください。
Vadzim 2017年

7

パッケージをより便利な階層でリファクタリングして、基本パッケージから外す必要があると思います。

ただし、これができない場合は、次のことを試してください。

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

ここで他の例を見つけることができます:スキャンをカスタマイズするためのフィルターの使用


おかげで、原則として私はリファクタリングのアイデアに同意します-それは私の最初の考えでした。残念ながら、それは私の特定の状況にとって本当に素晴らしいオプションではありません。
HolySamosa 2012年

優れたパッケージデザインはこの状況を回避できますが、それができない場合は...
ハハハ

4

私のために働くように思われる1つのことはこれです:

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

またはXMLの場合:

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

これは、デフォルトの。resourcePatternをオーバーライドします"**/*.class"

そのresourcePatternは常に同じであり、基本パッケージに関連しているため、これは基本パッケージのみを含めるための最もタイプセーフな方法のように思われます。


2

@SpringBootApplicationを使用することもできます。これは、Springのドキュメントによると 、1つのアノテーションで@ Configuration@ EnableAutoConfiguration @ ComponentScanの3つのアノテーションと同じ機能を実行します 。

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

Javadocによると、コンポーネントスキャンからすべてのクラスではなく、特定の自動構成クラスexclude除外することです。試行すると、「次のクラスは自動構成クラスではないため、除外できませんでした」というエラーが表示されます
アビジットサルカール

0

特定のパッケージを含めて、次のように除外することもできます。

含めると除外する(両方)

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

除外するだけ

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

Javadocによると、コンポーネントスキャンからすべてのクラスではなく、特定の自動構成クラスexclude除外することです。試行すると、「次のクラスは自動構成クラスではないため、除外できませんでした」というエラーが表示されます
アビジットサルカール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.