14

Spring の @ComponentScan は、タイプ セーフなbasePackageClasses属性を提供します。特に、私が取り組んでいるプロジェクトでパッケージの名前が変更されることは珍しくないため、使用するのに適しているようです。ドキュメントには次のように記載されています。

この属性によって参照される以外の目的を果たさない特別な no-op マーカー クラスまたはインターフェイスを各パッケージに作成することを検討してください。

...しかし、そのようなクラスの名前についてこれ以上のガイダンスはありません。これに関する慣習があるかどうか疑問に思っています。package-info.javaすべてのパッケージに既に存在します (Checkstyle によって強制されます) - これを再利用することをお勧めしますが、残念ながら Java はこの名前のクラスを許可していません。

(そのような標準が存在しない場合は、おそらくPackageInfoBasePackagePackageMarkerまたは同様のことを考えていますが、慣例があればそれに従うことを好みます。)

4

1 に答える 1

13

まだ答えがなく、決定を下さなければならなかったので、ここにあります:

マーカー クラス:

package com.companyname.appname.projectname.package1name;

/**
 * Empty marker class used to identify this package when using type-safe basePackageClasses in Spring @ComponentScan.
 */
public class PackageMarker {
    // Empty marker class
}

使用法:

@ComponentScan(basePackageClasses = {
    com.companyname.appname.projectname.package1name.PackageMarker.class,
    com.companyname.appname.projectname.package2name.PackageMarker.class,
    /* ...etc... */
})

PackageMarker命名の理由:

  1. 簡単に識別できるように、そのようなすべてのクラスに同じ名前を付けるのが賢明なようです。
  2. (package-info.java と同じように) "Package" で始めるのが賢明なようです。
  3. ドキュメントは「マーカークラス」を参照しているため、「マーカー」で終わるのが賢明なようです。
  4. 基本クラスと混同しないように、「ベース」という単語を含めないことを選択しました。
  5. package-info.java のような情報が含まれていないため、「Info」という単語を含めないことを選択しました。
  6. 他の単語 (「NoOp」など) を含めないことを選択して、他の可能な用途に向けて機敏で柔軟に保ちます。

より先駆的なコンテキストで使用されるマーカークラスの例を誰かが挙げることができれば、まだ興味があります...

于 2014-12-03T09:14:07.800 に答える