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
アノテーションを使用して指定されたコンポーネントが見つからないというエラーで失敗します。
私が望んでいることを行う正しい方法は何ですか?
ありがとう
@ ComponentScan は、次のような文字列配列を使用します。
@ComponentScan({"com.my.package.first","com.my.package.second"})
1つの文字列のみで複数のパッケージ名を指定すると、Springはこれを1つのパッケージ名として解釈するため、見つけることができません。
文字列としてベースパッケージの場所を指定する別のtype-safealternativeがあります。 こちらのAPIをご覧ください 、しかし、以下にも説明しました:
@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})
basePackageClasses指定子をクラス参照と共に使用すると、Springにこれらのパッケージをスキャンするよう指示されます(前述のalternatives)、ただし、このメソッドはtype-safeであり、IDEサポートを追加します将来のリファクタリングのために-私の本で大きなプラス。
APIから読み取ると、Springは、スキャンする各パッケージに、この属性の参照として使用する以外の目的を持たないno-opマーカークラスまたはインターフェイスを作成することをお勧めします。
IMO、マーカークラスは好きではありません(しかし、再び、パッケージ情報クラスとほとんど同じです)が、タイプセーフティ、IDEをサポートし、このスキャンに含める必要がある基本パッケージの数を大幅に削減することは、間違いなく、はるかに優れたオプションです。
パッケージ名を個別に指定します。パッケージ名には String[]
が必要です。
これの代わりに:
@ComponentScan("com.my.package.first,com.my.package.second")
これを使って:
@ComponentScan({"com.my.package.first","com.my.package.second"})
これを行う別の方法は、basePackages
フィールドを使用することです。これは、ComponentScanアノテーション内のフィールドです。
@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})
JarファイルからComponentScanアノテーション.classを調べると、文字列の配列を受け取るbasePackagesフィールドが表示されます。
public @interface ComponentScan {
String[] basePackages() default {};
}
ComponentScanを使用して、複数のパッケージをスキャンします
@ComponentScan({"com.my.package.first","com.my.package.second"})
この依存関係をpom.xmlに追加したことを確認してください
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
@ComponentScansアノテーションも使用できます。
@ComponentScans(value = { @ComponentScan("com.my.package.first"),
@ComponentScan("com.my.package.second") })