はじめに
アノテーションを制する者はJavaEEを制すということで、仕事で色々と試行錯誤している毎日なのですが、アノテーションについて説明しているサイトや書籍があまりないんですよね(英語が読めれば別なのでしょうが・・・)。そういうわけで、これまでに得た情報を自分なりにまとめていきたいと思います。正直アノテーション以前にJava経験があまりないので、色々と誤りがあるかもしれないことを最初にお断りしておきます。
一応下記のアノテーションで、ポピュラーなものをピックアップしていきたいと思います。
Named
DI対象として登録することを示すアノテーション。下記の例ではNamedBeanクラスを登録しています。
@Named
@Dependent
public class NamedBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String sayHello () {
return "Hello!! " + this.name;
}
}
Singleton
こちらもNamed同様にDI登録のためのアノテーションですが、シングルトンで生成されるようです。
@Singleton
public class SingletonBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String sayHello () {
return "Hello!! " + this.name;
}
}
Inject
NamedやSingletonによってDI登録したクラスのインスタンスを、文字通り「注入する」ためのアノテーション。下記の例では、TestLogicにnamedBeanとsingletonBeanのインスタンスを注入しています。
public class TestLogic {
@Inject
NamedBean namedBean;
@Inject
SingletonBean singletonBean;
RequestScoped
DI登録したクラスの生存期間を決定するためのアノテーションです。
上記のNamedBeanはRequestScopedを付与しているので、リクエスト~レスポンスの間まで生き続けます。
SessionScoped
DI登録したクラスの生存期間を決定するためのアノテーションです。
セッションが継続している、具体的にはログイン中は生き続けます。
ApplicationScoped
DI登録したクラスの生存期間を決定するためのアノテーションです。
アプリケーションの開始から終了まで生き続けます。
この辺はServlet/JSPのスコープ定義に似ているので理解しやすいですね。
ConversationScoped
DI登録したクラスの生存期間を決定するためのアノテーションです。
独自のスコープ定義をできるアノテーションのようです。
上記のスコープで表せない場合に使用するようですが、あまりよく分かっていません。
Dependent
DI登録したクラスの生存期間を決定するためのアノテーションです。
このアノテーションを指定した場合は、注入先と同じスコープが適用されるとのこと。
下記で詳しく検証していただいている方がおられたので参考にどうぞ。