アノテーションと設定ファイルの優先度
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にしてはいけないかは敢えて書かないが、このようにしてしまうと、アノテーションでインスタンスのコントロールを行おうとした場合に、首を捻ること請け合いだ。