それがどのように動作するかでJavaアノテーション

コメントとは何ですか

ノートには、すなわち、メタデータ、すなわち、一つのワード内のデータの説明を記述することができます。そこで、我々は、ソースメタデータ注釈コードと言うことができます。たとえば、次のコード:

@Override
public String toString() {
return "This is String Representation of current object.";
}
复制代码

上記のコード、書換えのtoString()メソッドと使用@Override注釈。

この方法は、親クラスに存在しない場合は実際には、@オーバーライドこのメソッドは書き換え方法(方法を記述したメタデータ)をコンパイラに伝えることです、コンパイラはメソッドが親クラスのメソッドをオーバーライドしていないことを示唆し、エラーになります。あなたが誤ってスペルが間違っている場合、例えば、のtoString()書かtoStrring(){ダブルR}、およびそこにプログラムがまだコンパイルして実行することができたことを指摘し@Override一切使用することはありませんが、実行し、結果は予想よりも大きく異なるだろう。

アノテーションは、クラス、メソッド、パラメータ、変数、及びパケットコンストラクタ宣言特別な改質剤に適用されます。これは、JSR-175の標準によって選択は、メタデータのためのツールについて説明しています。注釈が読者を助ける使用してください。

なぜノートを紹介

注釈(使用後も)を使用する前に、XMLは広く、メタデータを記述するために使用されます。いくつかのアプリケーションの開発を開始するとき、私は知らないし、建築家はXMLのメンテナンスが悪い行っている見つけました。彼らは、疎結合(およびいくつかのケースでも、完全に分離)されているのではなく、XMLやコードなどの密結合の何かとコードを使用するコード説明をしたいです。Googleで「注釈対XML」を検索する場合は、この問題に関する議論の多くが表示されます。最も興味深いのは、導入されたXML構成コードと構成を分離するために、その事実です。どちらのビューを使用すると、非常に困惑させることがあり、2つのビューがサイクルを構成しているように見えるが、それぞれに長所と短所があります。のは、例を介して2つの違いを理解しましょう。

あなたが設定に定数や多くのパラメータを適用したい場合は、特定のコードで接続していないので、この場合には、XMLは、良い選択です。あなたがサービスのための方法の声明をしたい場合は、注釈が原因で密に結合されたこの場合の注釈および方法において必要で、それを使用する方が良いだろう、開発者はこれを実現しなければなりません。

もう一つの非常に重要な要因は、注釈は、メタデータを記述するための標準的な方法を定義しています。これに先立ち、開発者は多くの場合、独自の方法でカスタムメタデータを使用しています。たとえば、ようにラベルされたインターフェース、コメント、過渡キーワード、およびを使用して。各プログラマは注釈とは異なり、独自の方法でこの標準的な方法を、メタデータを定義します。

どのように注釈付きの作品

時間ラベルまたはクラスまたはメンバーまたは入力変数パラメータの方法についてコメントする場合、注釈クラス、メソッド、メンバー変数と特定のプロセスのパラメータに関する注釈に対応するメカニズムが存在しなければなりません。

注釈を書くのは非常に簡単で、自分自身に注釈を付けるクラスであると言うことができます。注釈定義はインタフェースの定義と比較することができます。たとえば、標準の注釈@Overrideを見てください:

package java.lang;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
复制代码

あなたはそれが親クラスに同じ名前の関数をチェックする方法である、@オーバーライドアノテーションは何もしないように見える、見ることができますか?@Overrideは、注釈メタデータは、ビジネス・ロジックが含まれていない、ビジネスロジック実装されたユーザーが注釈されている定義しました。

@Overrideノートのために、そのユーザーは仮想マシンは、バイトコードレベルで動作しているJVM、コンパイル時にチェックし、その処理機構は、主にJVM内部処理です。

スプリングの別の例@Serviceの注釈、春IOCコンテナの走査開始時間は各クラスは、すべての注釈は、処理のためにそれらのサブ@Component @Service Beanクラスとして示されるであろう。

カスタムアノテーションを書きます

JDK5.0のバージョンはjava.lang.annotation、特記事項その他の注意事項で4元のノートを提供しています:

  • @Documented - ドキュメントJavaで注釈情報を追加するかどうか

  • @Retention - 注釈のライフサイクルの定義

  • @Target - 何のためのノート

  • @Inherited - サブクラスがコメントを継承できるようにするかどうか

@Retentionの注釈は、破棄されたどの段階で、ライフサイクルの注釈を定義します

  • RetentionPolicy.SOURCE - コンパイル時に破棄。コンパイラの最後にこれらのアノテーションは、もはや彼らは、バイトコードを書いていない、何の意味もありません。@Override、@SuppressWarningsは、このようなコメントに属します。

  • RetentionPolicy.CLASS - 廃棄されたクラスのロードには、バイトコードファイルに有用です。デフォルトでは、この方法を使用NOTE。

  • RetentionPolicy.RUNTIMEは - あなたは注釈情報を読み取るためにリフレクションを使用することができますので、実行はまた、ノートを維持、廃棄されることはありません。一般的にこのように使用されるカスタム注釈。

@target -注釈がここで使用されていることを示しています。あなたが明確でないとのコメントがどこにでも配置することができます。注釈属性は互換性があります。

  • ElementType.TYPE:クラス、インタフェース、または列挙宣言を記述するために使用

  • ElementType.FIELD:インスタンス変数を記述するために使用します

  • ElementType.METHOD

  • ElementType.PARAMETER

  • ElementType.CONSTRUCTOR

  • ElementType.LOCAL_VARIABLE

  • ElementType.ANNOTATION_TYPE別のコメント

  • 情報パッケージのjavaファイルを記録するためのElementType.PACKAGE

その後、最終的に内部ノートは、それを定義する方法ですか?注釈は、基本的な種類、文字列や列挙型をサポートしています。すべての属性がメソッドとして定義され、デフォルト値を提供することを可能にしていることに注意してください。

定義@AuthCheckの SpringMVCコントローラーは、法に作用する、注釈を。

package com.liuning.sys.auth;

import static java.lang.annotation.ElementType.METHOD;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Target(METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthCheck {
	String value() default "";
}
复制代码

注1つのプロパティのみである、あなたは、単に示されたプロパティ名を使用する必要がもはや、「値」と呼ぶことができませんでした。

春インターセプタHandlerInterceptorビジネスロジック@AuthCheck注釈、ここで使用される反射機構。

@Override
public boolean preHandle(HttpServletRequest request, 
                         HttpServletResponse response, 
                         Object handler) throws Exception {
	HandlerMethod hm = (HandlerMethod) handler;
	AuthCheck ac = hm.getMethodAnnotation(AuthCheck.class);
	if (ac != null) {
		if (ac.value() == "Login") {
			//进行业务逻辑操作
		}
	}
	return true;
}
复制代码

次の例では、上記のコメントを使用する方法を示します。ユーザー・コールは、ユーザーがログオンしたときに必要になります注釈メソッドを使用します。

@PostMapping("/list")
@AuthCheck(value = "Login")
public List<User> getUserList(@RequestBody @Valid User user) {
    
    return userService.getUserList(user);
}
复制代码

おすすめ

転載: juejin.im/post/5d1b2312f265da1bc23f913e