アノテーションと設定ファイルの優先度

DIコンテナを使用する際の、コンポーネントの生成に関する属性があったとする。例えばインスタンスのライフサイクルを決定するInstance属性。採り得る値は、唯一つのインスタンスを保障する"singleton"と、デマンドでインスタンスを生成する"prototype"の2値とする。

設定ファイルとアノテーションではそれぞれ、以下のように設定するとしよう。

  • 設定ファイル(XML)

[Component(Name = "hoge", Instance = Instance.SINGLETON)]
public class HogeImpl {
}

このときに、上記のように両方が設定された場合、どちらを優先すれば良いのだろう?

通常であれば

1.どちらとも明示的に記述されていなかった場合は、システムのデフォルトを使用
2.どちらかが明示的に記述されていた場合は、そちらを優先する
3.どちらとも明示的に記述されていた場合は、設定ファイルを優先する

とするだろう。ソースコードに直接記述するアノテーションよりも、設定ファイルのほうが後付けな意味合いが強いからだ。しかし、設定ファイルを優先するからといって、より厳密なXMLのために、この設定ファイルのDTDのinstance属性を以下のように設定してはいけない。

<!ELEMENT component 〜>
<!ATTLIST instance(singleton | prototype | outer) "prototype"
  〜
>

どうしてこのようなDTDにしてはいけないかは敢えて書かないが、このようにしてしまうと、アノテーションインスタンスのコントロールを行おうとした場合に、首を捻ること請け合いだ。