web-dev-qa-db-ja.com

@ComponentScanアノテーションを使用して複数のパスをスキャンする方法は?

Spring 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アノテーションを使用して指定されたコンポーネントが見つからないというエラーで失敗します。

私が望んでいることを行う正しい方法は何ですか?

ありがとう

75
Peter Wilkinson

@ ComponentScan は、次のような文字列配列を使用します。

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

1つの文字列のみで複数のパッケージ名を指定すると、Springはこれを1つのパッケージ名として解釈するため、見つけることができません。

136
hage

文字列としてベースパッケージの場所を指定する別のtype-safealternativeがあります。 こちらのAPIをご覧ください 、しかし、以下にも説明しました:

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

basePackageClasses指定子をクラス参照と共に使用すると、Springにこれらのパッケージをスキャンするよう指示されます(前述のalternatives)、ただし、このメソッドはtype-safeであり、IDEサポートを追加します将来のリファクタリングのために-私の本で大きなプラス。

APIから読み取ると、Springは、スキャンする各パッケージに、この属性の参照として使用する以外の目的を持たないno-opマーカークラスまたはインターフェイスを作成することをお勧めします。

IMO、マーカークラスは好きではありません(しかし、再び、パッケージ情報クラスとほとんど同じです)が、タイプセーフティ、IDEをサポートし、このスキャンに含める必要がある基本パッケージの数を大幅に削減することは、間違いなく、はるかに優れたオプションです。

42
Prancer

パッケージ名を個別に指定します。パッケージ名には String[] が必要です。

これの代わりに:

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

これを使って:

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

これを行う別の方法は、basePackagesフィールドを使用することです。これは、ComponentScanアノテーション内のフィールドです。

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

JarファイルからComponentScanアノテーション.classを調べると、文字列の配列を受け取るbasePackagesフィールドが表示されます。

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

ComponentScanを使用して、複数のパッケージをスキャンします

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

3
ksw

この依存関係をpom.xmlに追加したことを確認してください

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

@ComponentScansアノテーションも使用できます。

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