Springカスタム注釈の実装
3885 ワード
JAvaはjdk 1.5に注釈を導入し,springフレームワークもjava注釈を十分に発揮している.
次にSpringで注釈をカスタマイズする方法を簡単に説明します.ここではspringフレームワークのAOP(フェースプログラミング向け)を使用します.
一、カスタム注釈の作成
まずカスタム注釈LogAnnotationを作成し、descはカスタムパラメータです.
二、解析注記
次に,springのAOP(接面プログラミング向け)特性を用いた注釈の解析作業を完了する.
@Aspect注記でこのクラスを切面クラスにする
@Pointcutで切り込み点を指定します.ここで指定した切り込み点はLogAnnotation注記タイプ、つまり@LogAnnotation注記で修飾された方法で、その切り込み点に入ります.@Before先行通知:ある接続ポイントの前に実行された通知ですが、この通知は、例外が放出されない限り、接続ポイントの前の実行プロセスをブロックできません. @Aroundオービット通知:メソッド実行前後の操作を実現でき、メソッド内でpoint.proceed()を実行する必要がある.結果を返します. @AfterReturning後置通知:接続ポイントが正常に完了した後に実行される通知:たとえば、メソッドに異常が投げ出されず、正常に戻ります. @AfterThrowing異常通知:メソッドが異常終了を投げ出したときに実行される通知. @After後置通知:接続ポイントが正常に完了した後に実行される通知:たとえば、メソッドに異常が投げ出されず、正常に戻ります.
三、カスタム注釈の使用
コントロールで注記@LogAnnotationを直接使用
プロジェクトの開始、アクセスhttp://localhost:8080/hello
結果
以上が,おおよそのSpringでカスタム注釈を実現する簡単な流れである.
次にSpringで注釈をカスタマイズする方法を簡単に説明します.ここではspringフレームワークのAOP(フェースプログラミング向け)を使用します.
一、カスタム注釈の作成
まずカスタム注釈LogAnnotationを作成し、descはカスタムパラメータです.
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited()
public @interface LogAnnotation {
String desc();
}
二、解析注記
次に,springのAOP(接面プログラミング向け)特性を用いた注釈の解析作業を完了する.
@Aspect注記でこのクラスを切面クラスにする
@Pointcutで切り込み点を指定します.ここで指定した切り込み点はLogAnnotation注記タイプ、つまり@LogAnnotation注記で修飾された方法で、その切り込み点に入ります.
package com.blue.module.annotation;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
@Aspect //AOP
@Component
public class CommonLogAspect {
/* @Pointcut , LogAnnotation ,
@LogAnnotation , */
@Pointcut(value = "@annotation(com.blue.module.annotation.LogAnnotation)")
private void pointcut() {
}
/**
*
*
* @param point
* @param logA
* @return
*/
@Around(value = "pointcut() && @annotation(logA)")
public Object around(ProceedingJoinPoint point, LogAnnotation logA) {
System.out.println(" around ");
String msg = logA.desc();
//
Class clazz = point.getTarget().getClass();
//
Method method = ((MethodSignature) point.getSignature()).getMethod();
System.out.println(" :" + clazz + " :" + method + " :" + msg);
try {
return point.proceed(); //
} catch (Throwable throwable) {
throwable.printStackTrace();
return throwable.getMessage();
}
}
/**
*
*
* @param joinPoint
* @param logA
* @param result
* @return
*/
@AfterReturning(value = "pointcut() && @annotation(logA)", returning = "result")
public Object afterReturning(JoinPoint joinPoint, LogAnnotation logA, Object result) {
System.out.println(" afterReturning : result=" + result);
return result;
}
/**
*
*
* @param joinPoint
* @param logAnnotation
* @param ex
*/
@AfterThrowing(value = "pointcut() && @annotation(logAnnotation)", throwing = "ex")
public void afterThrowing(JoinPoint joinPoint, LogAnnotation logAnnotation, Exception ex) {
System.out.println(" afterThrowing ");
System.out.println(" :" + logAnnotation.desc() + " ");
}
}
三、カスタム注釈の使用
コントロールで注記@LogAnnotationを直接使用
@RestController
public class TestController{
@LogAnnotation(desc="My annotation")
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
プロジェクトの開始、アクセスhttp://localhost:8080/hello
結果
around
:class com.blue.module.controller.TestController :public java.lang.String com.blue.module.controller.TestController.hello() :My annotation
afterReturning : result=hello
以上が,おおよそのSpringでカスタム注釈を実現する簡単な流れである.