101

私は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ただし、これは、注釈を使用して指定されたコンポーネントが見つからないというエラーで失敗します。

私が求めていることを行う正しい方法は何ですか?

ありがとう

4

8 に答える 8

178

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

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

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

于 2012-05-29T07:21:12.470 に答える
50

基本パッケージの場所を文字列として指定するタイプ セーフな 方法がもう 1 つあります。API はこちらを参照してください。ただし、以下の図も示しています。

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

クラス参照でbasePackageClasses指定子を使用すると、Springにそれらのパッケージをスキャンするように指示します(前述の代替手段と同様)が、この方法はタイプセーフであり、将来のリファクタリングのためのIDEサポートを追加します-私の本では大きなプラスです.

API から読み取ると、Spring は、スキャンする各パッケージに no-op マーカー クラスまたはインターフェイスを作成することを提案します。これは、この属性の参照として使用される以外の目的はありません。

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

于 2014-01-24T12:55:24.340 に答える
20

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

これの代わりに:

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

これを使って:

@ComponentScan({"com.my.package.first","com.my.package.second"})
于 2012-05-29T07:23:11.040 に答える
12

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

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

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

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

または、クラスを明示的に言及することもできます。クラスの配列を受け取る

Class<?>[]  basePackageClasses
于 2016-02-10T14:19:35.210 に答える
5

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

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

于 2016-11-24T07:07:41.203 に答える