【JavaEE】アノテーションとは

#概要
JSFを勉強するにあたり、まず躓いたのが
＠Named
等のアノテーションだったので
初心者なりにふわっとまとめてみました。

#対象読者
 - Webアプリケーション開発初心者

#【JavaEE】アノテーションとは

>
**アノテーション**
【英】annotation
アノテーションとは、データに注釈となるう情報を、メタデータとして追加すること、あるいは、そのようにして追加されたメタデータのことである。
[参照：IT用語辞典バイナリ](http://www.sophia-it.com/content/%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)

補足として、メタデータとは「データの意味について記述したデータ」だそうです。

はい、補足したところでちんぷんかんぷんです。

一応私なりの解釈の結論としては
**クラスやメソッドに追加で(取り扱い方の)情報を付与するもの**
がアノテーションです。

今回はJavaEEで用いられるアノテーションについて
まずはServletを例に話を進めさせて頂きます。

```Sample.java
package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Sample
 */
@WebServlet("/Sample")
public class Sample extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Sample() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}
```


上記はEclipseのファイル生成でサーブレットファイルを選択した際
初めから記述されている部分です。

私は特に何も考えず、このdoGetメソッドやdoPostメソッドの中に
Modelを使った処理やViewの呼び出しを記述しているだけでしたので
正直この定型の意味を考えたことは一切ありませんでした。

アノテーションとは

``@WebServlet("/Sample")``

この部分を指します。

「**@ほにゃらら**」
とあったらアノテーションです。恐らく。

ちなみに
```@WebServlet("/Sample")```
はURLパターンを設定しているアノテーションだそうです。
上記のServletを実行したい際には

http://[サーバ名]/[アプリケーション名]/[URLパターン]

といったURLを指定しますが、この[URLパターン]の部分が"Sample"になります。
このServletが
 
 - ローカルホストのサーバ上
 - JavaEEという名前のプロジェクト（アプリケーション）

に存在するのであれば指定先は

http\://localhost:8080/JavaEE/Sample

になります。(:8080 はポート番号)

繰り返しになりますが、アノテーションとはこのような感じで
**クラスやメソッドに追加で情報を付与するもの**
といったイメージをしておけば良いと思います。


このアノテーションがどうかしたのかといったお話しですが
Eclipseでクラスファイルを生成しても自動では付いてくれません。
ですので自分で記述しないと管理Beanのつもりで書いたプログラムが思った通りに動いてくれません。
私はこの時点で白目でした。

そうとなれば、覚えるしかないです。

アノテーションもかなりの数がありそうなのですが
今回はJSFでよく見かけるアノテーションを2つだけ。

##JSFでよく見かけるアノテーション

```JsfBean.java
package com.javaee;

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@SessionScoped
public class JsfBean {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	// submitボタンが押下されたときに呼ばれるメソッド
	public void action() {
		this.name = "Action";
	}
}
```

JSP&ServletのModelで見かけそうな普通のクラスファイルですが
２つアノテーションが付与されています。

＠Named と ＠SessionScoped です。

###＠Named

CDI管理Beanに名前を付けます。
と言われてもあまりピンと来ないので

Servlet等に記述していた

JsfBean jsfBean = new JsfBean();

といったnew演算子を用いたインスタンスの生成を行わずとも
＠Namedアノテーションを付けておけば必要に応じて
jsfBean
という名前のインスタンスを利用できる状態にしておいてくれますよー
といったもの、だと思います。

Controller(Servlet)がないのに何処でインスタンス作るんだろうと思っていたのですが
＠Namedが頑張ってくれており
XHTML内でEL式を用いて好きに使える状態にしておいてくれるようです。
（EL式：#{htmlBean.val}）

###＠SessionScoped
Servletでもよく見かけましたスコープです。
JSP&ServletのWebアプリケーションでは
Controller（Servlet）内部で取得したページ出力に必要な情報を
SessionやらRequestやらApplicationのスコープに保存して
そのスコープを表示先のView(JSP)が自ら参照しにいく、といった流れだったと思うのですが

JSFではControllerがない（記述する場所がない）ので
アノテーションとして付与することにより
Beanごとにスコープで管理します。

＠RequestScopedは １回のHTTPリクエストの間のみ
＠SessionScopedは ブラウザ毎のセッションが切れるまで
＠ApplicationScoped アプリケーションが終了するまで

といった生存期間なので、扱いに関してはJSP&Servletと同じかと。

他にもScopeとして

＠ViewScoped　ページが切り替わるまで（同一である間）
＠FlowScoped (JSF2.2より)　自分で定義した特定フロー間
　　　※faces-config.xml内、もしくはコードで定義するとのこと。

があります。

**※注意点**
各Scopeはインポートする際

 - javax.enterprise.context.RequestScoped
 - javax.faces.bean.RequestScoped

など複数のインポート先が存在します。
「beanで使うんだから後者じゃろ！」
と思考停止で選択したら間違いだった！なんて場合もあるので注意です。

以上、アノテーションについて
私がJSFの入口でまず躓いたポイントでしたのでまとめてみました。