@AnnotateWithをメタアノテーションとして使用可能に

@AnnotateWithというアノテーションを使うと、aptで生成される実装クラスの特定の箇所に任意のアノテーションをつけられます。これは設定クラスをDaoにDIするために使用します。Guiceアノテーションをつける場合の例はこんなです。

 @Dao
 @AnnotateWith(annotations = {
         @Annotation(target = AnnotationTarget.CONSTRUCTOR, type = Inject.class),
         @Annotation(target = AnnotationTarget.CONSTRUCTOR_PARAMETER, type = Named.class, elements = "\"sales\"") })
 public interface EmployeeDao {
     ...
 }

これまで@AnnotateWithをDaoごとに指定しなければいけませんでしたが、次のバージョン(1.0.0-RC3)からは、別の任意のアノテーションに@AnnotateWithを記述しておいて、Daoにはそのアノテーションを使用できるようになります。通常はどのDaoにも一律同じアノテーションを注釈したいはずですので手間が省けると思います。
たとえば、InjectConfigというアノテーションを作ってそこに@AnnotateWithを注釈します。アノテーションアノテーションを注釈する、いわゆるメタアノテーションです。

 @AnnotateWith(annotations = {
         @Annotation(target = AnnotationTarget.CONSTRUCTOR, type = Inject.class),
         @Annotation(target = AnnotationTarget.CONSTRUCTOR_PARAMETER, type = Named.class, elements = "\"sales\"") })
 public @interface InjectConfig {
     ...
 }

次のように使います。

 @Dao
 @InjectConfig
 public interface EmployeeDao {
     ...
 }
 @Dao
 @InjectConfig
 public interface DepartmentDao {
     ...
 }

効果は@AnnotateWithを直接Daoに注釈している場合と同じです。あと@AnnotateWithを使った場合は、@Daoのconfig要素の指定を省略できるようになっています。

SNAPSHOT作成したのでよかったら使ってください。
http://maven.seasar.org/maven2-snapshot/org/seasar/doma/doma/1.0.0-RC3-SNAPSHOT/doma-1.0.0-RC3-20100130.043940-1.jar

1.0.0-RC2からの変更点は次のとおりです。

Improvement

  • [DOMA-128] - [Core] ドメインクラス、エンティティクラス、Daoインタフェースをパッケージプライベートの可視性で定義できるようにしました。
  • [DOMA-129] - [Core] aptで生成されるエンティティクラスとドメインクラスのメタクラスのgetメソッドの名前をgetSingletonInternalに変更しました。
  • [DOMA-130] - [Core] @AnnotateWithを任意のアノテーションXに注釈可能とし、XがDaoに注釈されていればDaoに直接@AnnotateWithが注釈されている場合と同じ挙動にしました。
  • [DOMA-131] - [Core] @Entityのlistener要素に指定されたクラスが抽象型もしくはデフォルトコンストラクタを持たない場合にaptでエラーとしました。
  • [DOMA-132] - [Core] @SequenceGeneratorのimplementer要素に指定されたクラスが抽象型もしくはデフォルトコンストラクタを持たない場合にaptでエラーとしました。
  • [DOMA-133] - [Core] @TableGeneratorのimplementer要素に指定されたクラスが抽象型もしくはデフォルトコンストラクタを持たない場合にaptでエラーとしました。