28
What’s Annotation? HASUNUMA Kenji Vice president, GlassFish Users Group Japan [email protected] Twitter: @btnrouge

What's Annotation?

Embed Size (px)

DESCRIPTION

社内勉強会「アノテーションについて」講義資料(改訂版)

Citation preview

Page 1: What's Annotation?

What’s Annotation?

HASUNUMA KenjiVice president, GlassFish Users Group [email protected]: @btnrouge

Page 2: What's Annotation?

アノテーションとは?

• Javaのコードの構成要素につけられた「意味」のこと

• コンパイラ、ツール、コードが解釈(⇔コメント=人間が解釈)

• Java EEでは各種設定をアノテーションで記述する(→XML記述の大幅減少)

Page 3: What's Annotation?

この世界が生まれた意味、私みたいな弱虫がここに来ちゃった意味、

そして君と私が出会った意味を見つけてください。

Page 4: What's Annotation?

意味 説明

目印@Deprecated、@OverrideなどJava言語仕様と密接に関連(※主にコンパイラが解釈)

処理対象Sevlet、EJB、JSF、JPA、JAXB、JAX-WS、JAX-RSなどで、クラス・メソッド・フィールドを処理対象として認識させる。

マッピング異なるデータ型(例: XMLとJavaBeans)のマッピングを定義する。JPA、JAXB(依存関係にあるJAX-WSとJAX-RSを含む)などで使用。

Page 5: What's Annotation?

意味 説明

Dependency Injection

CDI、その他DIコンテナで使用。モジュール間の疎結合を実現する他、CDIではJNDIルックアップの簡略化とAOP機能を実現する。

値検証 Bean Validationが代表例。値検証ルールを対象となるフィールド・メソッドに追加する。

設定従来XMLで記述していた内容をアノテーションで設定する。Java EE 5以降、新規・改訂APIから順次導入。

Page 6: What's Annotation?

アノテーションの基本文法

Page 7: What's Annotation?

アノテーションの形式

@AnnotationName(parameters list)

•アノテーションをつけられる場所:フィールド、メソッド、クラス、インタフェース、パッケージ、メソッドの引数、アノテーション

Page 8: What's Annotation?

最小のアノテーション

@Deprecated

•パラメータを持たないアノテーション•マーカー・アノテーションともいう

Page 9: What's Annotation?

パラメータを持つアノテーション(1)

@Table(name = “tbl”, schema = “app”)

•パラメータ: String、プリミティブ型、アノテーション、およびそれらの配列

•複数ある場合はカンマ区切り、順不同

Page 10: What's Annotation?

パラメータを持つアノテーション(2)

@Table(name = “tbl”)

•デフォルト値を持つパラメータは省略できる

•すべてデフォルト値の場合、マーカー・アノテーションと同様の表記

Page 11: What's Annotation?

パラメータを持つアノテーション(3)

@HttpMethod(value = “GET”)@HttpMethod(“GET”)

• valueという名前を持つパラメータは、それだけが指定された場合、パラメータ名を省略できる

Page 12: What's Annotation?

配列パラメータを持つアノテーション

@XmlType(propOrder = {“a”, “b”})

•パラメータが配列の場合、要素を { } で囲んで指定する

@XmlType(propOrder = “c”)

•ただし要素が1個のみの場合 { } は不要

Page 13: What's Annotation?

代表的なアノテーション

Page 14: What's Annotation?

Javaの言語仕様と関連しているものJavaの言語仕様と関連しているもの@Target

アノテーションを実装する際に使用するもの(これらはアノテーションの定義に付加)

@Retention アノテーションを実装する際に使用するもの(これらはアノテーションの定義に付加)@Documented

アノテーションを実装する際に使用するもの(これらはアノテーションの定義に付加)

@Inherited

アノテーションを実装する際に使用するもの(これらはアノテーションの定義に付加)

@Deprecated 非推奨API(パッケージも対象)

@Override オーバーライドしたメソッド

Page 15: What's Annotation?

Servletで使用されるものServletで使用されるもの@WebServlet サーブレットクラスに付加

@WebFilter フィルタクラスに付加

@WebListener リスナクラスに付加

@WebInitParam 初期化パラメータを指定

@MultpartConfig ファイルアップロード設定

@Resource データソース等の代入を指示

Page 16: What's Annotation?

Enterprise JavaBeansで使用されるものEnterprise JavaBeansで使用されるもの@ManagedBean 管理Beanクラスに付加

@Stateless Stateless Beanクラス付加

@Stateful Stateful Beanクラスに付加

@Singleton Singleton Beanクラスに付加

@Resources データソース等の代入を指示

@PostConstruct 前処理を行うメソッドに付加

@PreDestroy 後処理を行うメソッドに付加

Page 17: What's Annotation?

Java Persistence APIで使用されるものJava Persistence APIで使用されるもの@PersistenceContext Entity Managerの代入を指示

@Entity Entityクラスに付加

@Table 対応するDBテーブル名を明示

@Id Entityの主キーに付加

@Column 対応するDBカラム名を明示

@Temporal 日付型を明示

@NamedQuery 定義済みクエリ

Page 18: What's Annotation?

JavaServer Facesで使用されるものJavaServer Facesで使用されるもの@ManagedBean JSFの管理Beanクラスに付加

@ManagedProperty JSFのプロパティに付加

@ApplicationScoped

JSFの管理Beanクラスに付加し、オブジェクトの生存期間を明示

@SessionScoped JSFの管理Beanクラスに付加し、オブジェクトの生存期間を明示@RequestScoped

JSFの管理Beanクラスに付加し、オブジェクトの生存期間を明示

@ViewScoped

JSFの管理Beanクラスに付加し、オブジェクトの生存期間を明示

Page 19: What's Annotation?

JAX-WSで使用されるものJAX-WSで使用されるもの@WebService Webサービスクラスに付加

@WebMethod Webサービスメソッドに付加

@WebParam メソッド引数のカスタマイズ

@WebResult メソッド戻り値のカスタマイズ

Page 20: What's Annotation?

JAX-RSで使用されるものJAX-RSで使用されるもの@Path リソースの相対URI

@GET GETメソッドのハンドラ

@POST POSTメソッドのハンドラ

@PUT PUTメソッドのハンドラ

@DELETE DELETEメソッドのハンドラ

@Consumes 入力形式 (MIMEタイプ)

@Produces 出力形式 (MIMEタイプ)

Page 21: What's Annotation?

JAXBで使用されるものJAXBで使用されるもの@XmlType 対応するXMLスキーマを指定

@XmlRootElement XMLのルート要素

@XmlElement XMLの要素

@XmlAttribute XMLの属性

@XmlAccessType XMLとJavaのマッピング方式

@XmlEnum XMLの列挙型とJavaのenumをマッピングさせる場合に使用@XmlEnumValueXMLの列挙型とJavaのenumをマッピングさせる場合に使用

Page 22: What's Annotation?

Contexts and Dependency Injectionで使用されるものContexts and Dependency Injectionで使用されるもの

@Inject オブジェクトの代入を指示

@Named 対象となるクラスに付加し、クラスの識別情報を設定@Qualifier対象となるクラスに付加し、クラスの識別情報を設定

@Scopeオブジェクト代入時の条件を指示するアノテーションに適用

@Singletonオブジェクトがシングルトンであることを明示(@Scopeを適用)

Page 23: What's Annotation?

Examples

Page 24: What's Annotation?

/** 例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などは省略}

Page 25: What's Annotation?

/** 例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”; }}

Page 26: What's Annotation?

•アノテーションは、コードに込めた「意味」をコンパイラやフレームワークに伝えるための手段

• Java EEではアノテーションを積極的に受け取り、大半の設定においてXMLに代わる手段として活用

Page 27: What's Annotation?

•アノテーションは、それが認識される場合と無視される場合がある

•例えばJPAのアノテーションはJAX-RSでは無視される

• CDIなど、複数のAPIが共通して認識するアノテーションもある