What's Annotation?
-
Upload
kenji-hasunuma -
Category
Technology
-
view
10.124 -
download
2
description
Transcript of What's Annotation?
What’s Annotation?
HASUNUMA KenjiVice president, GlassFish Users Group [email protected]: @btnrouge
アノテーションとは?
• Javaのコードの構成要素につけられた「意味」のこと
• コンパイラ、ツール、コードが解釈(⇔コメント=人間が解釈)
• Java EEでは各種設定をアノテーションで記述する(→XML記述の大幅減少)
この世界が生まれた意味、私みたいな弱虫がここに来ちゃった意味、
そして君と私が出会った意味を見つけてください。
意味 説明
目印@Deprecated、@OverrideなどJava言語仕様と密接に関連(※主にコンパイラが解釈)
処理対象Sevlet、EJB、JSF、JPA、JAXB、JAX-WS、JAX-RSなどで、クラス・メソッド・フィールドを処理対象として認識させる。
マッピング異なるデータ型(例: XMLとJavaBeans)のマッピングを定義する。JPA、JAXB(依存関係にあるJAX-WSとJAX-RSを含む)などで使用。
意味 説明
Dependency Injection
CDI、その他DIコンテナで使用。モジュール間の疎結合を実現する他、CDIではJNDIルックアップの簡略化とAOP機能を実現する。
値検証 Bean Validationが代表例。値検証ルールを対象となるフィールド・メソッドに追加する。
設定従来XMLで記述していた内容をアノテーションで設定する。Java EE 5以降、新規・改訂APIから順次導入。
アノテーションの基本文法
アノテーションの形式
@AnnotationName(parameters list)
•アノテーションをつけられる場所:フィールド、メソッド、クラス、インタフェース、パッケージ、メソッドの引数、アノテーション
最小のアノテーション
@Deprecated
•パラメータを持たないアノテーション•マーカー・アノテーションともいう
パラメータを持つアノテーション(1)
@Table(name = “tbl”, schema = “app”)
•パラメータ: String、プリミティブ型、アノテーション、およびそれらの配列
•複数ある場合はカンマ区切り、順不同
パラメータを持つアノテーション(2)
@Table(name = “tbl”)
•デフォルト値を持つパラメータは省略できる
•すべてデフォルト値の場合、マーカー・アノテーションと同様の表記
パラメータを持つアノテーション(3)
@HttpMethod(value = “GET”)@HttpMethod(“GET”)
• valueという名前を持つパラメータは、それだけが指定された場合、パラメータ名を省略できる
配列パラメータを持つアノテーション
@XmlType(propOrder = {“a”, “b”})
•パラメータが配列の場合、要素を { } で囲んで指定する
@XmlType(propOrder = “c”)
•ただし要素が1個のみの場合 { } は不要
代表的なアノテーション
Javaの言語仕様と関連しているものJavaの言語仕様と関連しているもの@Target
アノテーションを実装する際に使用するもの(これらはアノテーションの定義に付加)
@Retention アノテーションを実装する際に使用するもの(これらはアノテーションの定義に付加)@Documented
アノテーションを実装する際に使用するもの(これらはアノテーションの定義に付加)
@Inherited
アノテーションを実装する際に使用するもの(これらはアノテーションの定義に付加)
@Deprecated 非推奨API(パッケージも対象)
@Override オーバーライドしたメソッド
Servletで使用されるものServletで使用されるもの@WebServlet サーブレットクラスに付加
@WebFilter フィルタクラスに付加
@WebListener リスナクラスに付加
@WebInitParam 初期化パラメータを指定
@MultpartConfig ファイルアップロード設定
@Resource データソース等の代入を指示
Enterprise JavaBeansで使用されるものEnterprise JavaBeansで使用されるもの@ManagedBean 管理Beanクラスに付加
@Stateless Stateless Beanクラス付加
@Stateful Stateful Beanクラスに付加
@Singleton Singleton Beanクラスに付加
@Resources データソース等の代入を指示
@PostConstruct 前処理を行うメソッドに付加
@PreDestroy 後処理を行うメソッドに付加
Java Persistence APIで使用されるものJava Persistence APIで使用されるもの@PersistenceContext Entity Managerの代入を指示
@Entity Entityクラスに付加
@Table 対応するDBテーブル名を明示
@Id Entityの主キーに付加
@Column 対応するDBカラム名を明示
@Temporal 日付型を明示
@NamedQuery 定義済みクエリ
JavaServer Facesで使用されるものJavaServer Facesで使用されるもの@ManagedBean JSFの管理Beanクラスに付加
@ManagedProperty JSFのプロパティに付加
@ApplicationScoped
JSFの管理Beanクラスに付加し、オブジェクトの生存期間を明示
@SessionScoped JSFの管理Beanクラスに付加し、オブジェクトの生存期間を明示@RequestScoped
JSFの管理Beanクラスに付加し、オブジェクトの生存期間を明示
@ViewScoped
JSFの管理Beanクラスに付加し、オブジェクトの生存期間を明示
JAX-WSで使用されるものJAX-WSで使用されるもの@WebService Webサービスクラスに付加
@WebMethod Webサービスメソッドに付加
@WebParam メソッド引数のカスタマイズ
@WebResult メソッド戻り値のカスタマイズ
JAX-RSで使用されるものJAX-RSで使用されるもの@Path リソースの相対URI
@GET GETメソッドのハンドラ
@POST POSTメソッドのハンドラ
@PUT PUTメソッドのハンドラ
@DELETE DELETEメソッドのハンドラ
@Consumes 入力形式 (MIMEタイプ)
@Produces 出力形式 (MIMEタイプ)
JAXBで使用されるものJAXBで使用されるもの@XmlType 対応するXMLスキーマを指定
@XmlRootElement XMLのルート要素
@XmlElement XMLの要素
@XmlAttribute XMLの属性
@XmlAccessType XMLとJavaのマッピング方式
@XmlEnum XMLの列挙型とJavaのenumをマッピングさせる場合に使用@XmlEnumValueXMLの列挙型とJavaのenumをマッピングさせる場合に使用
Contexts and Dependency Injectionで使用されるものContexts and Dependency Injectionで使用されるもの
@Inject オブジェクトの代入を指示
@Named 対象となるクラスに付加し、クラスの識別情報を設定@Qualifier対象となるクラスに付加し、クラスの識別情報を設定
@Scopeオブジェクト代入時の条件を指示するアノテーションに適用
@Singletonオブジェクトがシングルトンであることを明示(@Scopeを適用)
Examples
/** 例1: JPAのエンティティクラス */@Entity // JPAのエンティティ(=役割)
@Table(name = “emp”) // empテーブルとマッピングpublic class Employee { @Id // エンティティの主キー (=役割)
@Column(name = “id”) // emp.idカラムとマッピング private long id;
@Column(name = “name”) // emp.nameカラムとマッピング private String name; // getter/setterなどは省略}
/** 例2: Dependency Injection (CDI) */@Stateless // Stateless EJB(=役割)public class SomeBean { // CDIコンテナにより、変数beanにAnotherBeanのインスタンス // が自動的に代入される @Inject // Dependency Injection private AnotherBean bean; /* [In Action] * 厳密にはAOPに対応するためコンテナが自動生成したAnotherBeanのサブクラス * (=プロキシ)がJNDIルックアップにより代入されるが、@Injectアノテーションにより * プログラマは通常、そのことを意識する必要はない。 */ public String getMessage() { return bean.sayHello(); }}
----------------------------------------------------------------------/** AnotherBean */@Statelesspublic class AnotherBean { public String sayHello() { return “Hello, world”; }}
•アノテーションは、コードに込めた「意味」をコンパイラやフレームワークに伝えるための手段
• Java EEではアノテーションを積極的に受け取り、大半の設定においてXMLに代わる手段として活用
•アノテーションは、それが認識される場合と無視される場合がある
•例えばJPAのアノテーションはJAX-RSでは無視される
• CDIなど、複数のAPIが共通して認識するアノテーションもある
What’s Annotation?HASUNUMA [email protected]
Twitter: @btnrouge