JAvaカスタム注釈spring aop実装注釈
6237 ワード
JAvaカスタム注釈
1.いくつかの一般的な注釈の解釈
@Targetは、Annotationによって修飾されたオブジェクト範囲を示します.Annotationはpackages、types(クラス、インタフェース、列挙、Annotationタイプ)、タイプメンバー(メソッド、構築メソッド、メンバー変数、列挙値)、メソッドパラメータおよびローカル変数(ループ変数、catchパラメータなど).Annotationタイプの宣言でtargetを使用すると、その修飾のターゲットがより明確になります.
≪アクション|Actions|emdw≫:注釈を記述するための使用範囲(すなわち、説明された注釈がどこで使用できるか)
値(ElementType)は次のとおりです.
1.CONTRUCTOR:コンストラクタ2を記述するために用いる.FIELD:ドメイン3の記述に用いる.LOCAL_VARABLE:局所変数4を記述するために用いる.METHOD:説明方法5に用いる.PACKAGE:パケット6を記述するためのものである.PARAMETER:パラメータ7の記述に用いる.TYPE:クラス、インタフェース(注釈タイプを含む)またはenum宣言の記述に使用
@Retentionは、このAnnotationが保持される時間の長さを定義します.一部のAnnotationはソースコードにのみ表示され、コンパイラによって破棄されます.他のいくつかはclassファイルにコンパイルされています.classファイルにコンパイルされたAnnotationは、仮想マシンによって無視される可能性がありますが、classがマウントされたときに読み込まれるものもあります(Annotationとclassは使用上分離されているため、classの実行には影響しません.このmeta-Annotationを使用すると、Annotationの「ライフサイクル」を制限できます.
≪アクション|Actions|emdw≫:注釈情報を保存するには、注釈のライフサイクルを記述するためにどのレベルが必要かを示します(すなわち、説明された注釈がどの範囲で有効かを示します).
値(RetentionPoicy)は次のとおりです.
1.SOURCE:ソースファイルで有効(すなわちソースファイル予約)2.CLASS:classファイルで有効(すなわちclass予約)3.RUNTIME:実行時に有効(すなわち実行時予約)
@Documentedは、他のタイプのannotationを記述するために、注釈されたプログラムメンバーの共通APIとして使用されるべきであり、javadocのようなツールでドキュメント化することができる.Documentedはタグ注記で、メンバーはいません.
@Inheritedメタ注釈はタグ注釈であり、@Inheritedはある注釈のタイプが継承されていることを述べている.@Inherited修飾を使用したannotationタイプがclassに使用される場合、このannotationはclassのサブクラスに使用されます.
注意:@Inherited annotationタイプは、マークアップされたclassのサブクラスに継承されます.クラスは、実装されたインタフェースからannotationを継承しません.メソッドは、再ロードされたメソッドからannotationを継承しません.
@Inherited annotationタイプ表記のannotationのRetentionがRetentionPolicyである場合RUNTIMEでは、反射APIがこの継承性を強化する.Javaを使用するとlang.reflect@Inherited annotationタイプのannotationをクエリーすると、反射コードチェックが展開されます.classとその親クラスが、指定したannotationタイプが発見されるまで、またはクラス継承構造の最上位に到達するまでチェックします.
2.カスタム注釈の宣言
@interfaceを使用して注釈をカスタマイズするとjavaが自動的に継承されます.lang.annotation.Annotationインタフェースは、コンパイラによって自動的に他の詳細を完了します.注記を定義するときは、他の注記やインタフェースを継承することはできません.@interfaceは注釈を宣言するために使用され、各メソッドは実際に構成パラメータを宣言します.メソッドの名前はパラメータの名前で、戻り値タイプはパラメータのタイプです(戻り値タイプは基本タイプ、Class、String、enumのみ).defaultでパラメータのデフォルト値を宣言できます.
注記フォーマットの定義:public@interface注記名{定義体}
注記パラメータのサポート可能なデータ型:
1.すべての基本データ型(int,float,boolean,byte,double,char,long,short)2.Stringタイプ3.Classタイプ4.Enumタイプ5.Annotationタイプ6.以上のすべてのタイプの配列
Annotationタイプのパラメータはどのように設定すればいいですか.第一に、publicまたはデフォルト(default)の2つのアクセス権で修飾するしかありません.たとえば、String value()ここではメソッドをdefaulデフォルトタイプに設定します.第二に、パラメータメンバーは、基本タイプbyte、short、char、int、long、float、double、booleanの8種類の基本データ型とString、Enum、Class、annotationsなどのデータ型しか使用できず、これらのタイプの配列を使用することができる.たとえば、String value()ここのパラメータメンバーはStringです.
簡単なdemoを検証します.
注記クラス:
一般的なプロジェクトでのアプリケーションシーンは、システムログの記録、ログイン検証など、springのaopと組み合わせて実現される可能性があります.
プロジェクトで使用したログインの検証ロジックは、私たちが注釈をカスタマイズする方法を加えて、検証を行う必要があります.ログインしたことがあるかどうか、ログインしたことがあるかどうか、ログインしたことがないかどうか、ログインページにジャンプします.
注記クラス:
テストクラス:
カスタム注釈の注釈の詳細については、記事を参照してください.http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
1.いくつかの一般的な注釈の解釈
@Targetは、Annotationによって修飾されたオブジェクト範囲を示します.Annotationはpackages、types(クラス、インタフェース、列挙、Annotationタイプ)、タイプメンバー(メソッド、構築メソッド、メンバー変数、列挙値)、メソッドパラメータおよびローカル変数(ループ変数、catchパラメータなど).Annotationタイプの宣言でtargetを使用すると、その修飾のターゲットがより明確になります.
≪アクション|Actions|emdw≫:注釈を記述するための使用範囲(すなわち、説明された注釈がどこで使用できるか)
値(ElementType)は次のとおりです.
1.CONTRUCTOR:コンストラクタ2を記述するために用いる.FIELD:ドメイン3の記述に用いる.LOCAL_VARABLE:局所変数4を記述するために用いる.METHOD:説明方法5に用いる.PACKAGE:パケット6を記述するためのものである.PARAMETER:パラメータ7の記述に用いる.TYPE:クラス、インタフェース(注釈タイプを含む)またはenum宣言の記述に使用
@Retentionは、このAnnotationが保持される時間の長さを定義します.一部のAnnotationはソースコードにのみ表示され、コンパイラによって破棄されます.他のいくつかはclassファイルにコンパイルされています.classファイルにコンパイルされたAnnotationは、仮想マシンによって無視される可能性がありますが、classがマウントされたときに読み込まれるものもあります(Annotationとclassは使用上分離されているため、classの実行には影響しません.このmeta-Annotationを使用すると、Annotationの「ライフサイクル」を制限できます.
≪アクション|Actions|emdw≫:注釈情報を保存するには、注釈のライフサイクルを記述するためにどのレベルが必要かを示します(すなわち、説明された注釈がどの範囲で有効かを示します).
値(RetentionPoicy)は次のとおりです.
1.SOURCE:ソースファイルで有効(すなわちソースファイル予約)2.CLASS:classファイルで有効(すなわちclass予約)3.RUNTIME:実行時に有効(すなわち実行時予約)
@Documentedは、他のタイプのannotationを記述するために、注釈されたプログラムメンバーの共通APIとして使用されるべきであり、javadocのようなツールでドキュメント化することができる.Documentedはタグ注記で、メンバーはいません.
@Inheritedメタ注釈はタグ注釈であり、@Inheritedはある注釈のタイプが継承されていることを述べている.@Inherited修飾を使用したannotationタイプがclassに使用される場合、このannotationはclassのサブクラスに使用されます.
注意:@Inherited annotationタイプは、マークアップされたclassのサブクラスに継承されます.クラスは、実装されたインタフェースからannotationを継承しません.メソッドは、再ロードされたメソッドからannotationを継承しません.
@Inherited annotationタイプ表記のannotationのRetentionがRetentionPolicyである場合RUNTIMEでは、反射APIがこの継承性を強化する.Javaを使用するとlang.reflect@Inherited annotationタイプのannotationをクエリーすると、反射コードチェックが展開されます.classとその親クラスが、指定したannotationタイプが発見されるまで、またはクラス継承構造の最上位に到達するまでチェックします.
2.カスタム注釈の宣言
@interfaceを使用して注釈をカスタマイズするとjavaが自動的に継承されます.lang.annotation.Annotationインタフェースは、コンパイラによって自動的に他の詳細を完了します.注記を定義するときは、他の注記やインタフェースを継承することはできません.@interfaceは注釈を宣言するために使用され、各メソッドは実際に構成パラメータを宣言します.メソッドの名前はパラメータの名前で、戻り値タイプはパラメータのタイプです(戻り値タイプは基本タイプ、Class、String、enumのみ).defaultでパラメータのデフォルト値を宣言できます.
注記フォーマットの定義:public@interface注記名{定義体}
注記パラメータのサポート可能なデータ型:
1.すべての基本データ型(int,float,boolean,byte,double,char,long,short)2.Stringタイプ3.Classタイプ4.Enumタイプ5.Annotationタイプ6.以上のすべてのタイプの配列
Annotationタイプのパラメータはどのように設定すればいいですか.第一に、publicまたはデフォルト(default)の2つのアクセス権で修飾するしかありません.たとえば、String value()ここではメソッドをdefaulデフォルトタイプに設定します.第二に、パラメータメンバーは、基本タイプbyte、short、char、int、long、float、double、booleanの8種類の基本データ型とString、Enum、Class、annotationsなどのデータ型しか使用できず、これらのタイプの配列を使用することができる.たとえば、String value()ここのパラメータメンバーはStringです.
簡単なdemoを検証します.
注記クラス:
package xhsoft.yxd.admin.controller;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* @author WangMeng
* @date 2017 1 11
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonAnnotation
{
String name();
int age();
}
テストクラス:package xhsoft.yxd.admin.controller;
/**
* @author WangMeng
* @date 2017 1 11
*/
@PersonAnnotation(name = "11", age = 22)
public class TestAnnotation
{
public static void print(Class c)
{
System.out.println(c.getName());
// java.lang.Class getAnnotation , , 。 null
PersonAnnotation person = (PersonAnnotation) c.getAnnotation(PersonAnnotation.class);
if (person != null)
{
System.out.println("name:" + person.name() + " age:" + person.age());
}
else
{
System.out.println("person unknown!");
}
}
public static void main(String[] args)
{
TestAnnotation.print(TestAnnotation.class);
}
}
一般的なプロジェクトでのアプリケーションシーンは、システムログの記録、ログイン検証など、springのaopと組み合わせて実現される可能性があります.
プロジェクトで使用したログインの検証ロジックは、私たちが注釈をカスタマイズする方法を加えて、検証を行う必要があります.ログインしたことがあるかどうか、ログインしたことがあるかどうか、ログインしたことがないかどうか、ログインページにジャンプします.
注記クラス:
package xhsoft.web.tools.logined;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* @author Corpse-work
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Logined
{
/**
*
* @return
* @author Corpse-work
* @Date 2016 10 21
*/
String[] others() default {};
}
注釈実装クラス(この注釈を使用して何をする必要があるか)package xhsoft.web.tools.logined;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
*
*
* @author Corpse-work
*/
@Aspect// spring aop, aop
@Component
public class LoginedAspect
{
@Autowired
private AbsLoginHelper loginHelper;
@Around(value = "@annotation(logined)")// logined @Around spring aop
public Object checkLogin(ProceedingJoinPoint join, Logined logined) throws Throwable
{
// request,response
Object[] args = join.getArgs();
// username,password
String[] orherString=logined.others();
//
Object ret = join.proceed();
// 。。。。。。。
return null;
}
}
テストクラス:
package xhsoft.yxd.admin.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import xhsoft.web.tools.logined.Logined;
/**
* @author WangMeng
* @date 2017 1 13
*/
@Controller
@RequestMapping("/admin")
public class Test
{
@RequestMapping("/logintest")
@Logined(others="username,password")
public void loginTest(HttpServletRequest request, HttpServletResponse response)
{
System.out.println("logintest......");
}
}
カスタム注釈の注釈の詳細については、記事を参照してください.http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html