Springboot-AOPログブロックによる実装

4102 ワード

はじめに
springのAOP機能を利用して、私たちはAOPをグローバル異常処理、グローバル要求ブロックなどに応用することができます.本論文の核心機能はAOPを使用してログ記録を実現することです.例えば、どのユーザーがどのような操作を行ったのか、成功したプロジェクトに対して記録しなければならないので、知識追跡者は簡単なモデル応用を提供します.
二定義列挙
列挙定義のタイプはログを実現するどのような操作であり、以下に示すように、登録ログがあり、削除変更ログがあり、異なるシステムは異なるログを定義することができ、読者は自由に選択することができる.
public enum LogEnum {

    UNOPERATE(0,"     "),
    SELECT(1,"  "),
    INSERT(2,"  "),
    UPDATE(3,"  "),
    DELETE(4,"  "),
    EXPORT(5,"excel  "),
    LOGIN(6,"  "),
    LOGOUT(7,"  "),
    ;

    LogEnum( Integer code, String operate) {
        this.operate = operate;
        this.code = code;
    }

    LogEnum(){

    }

    //   
    private String operate;
    //    
    private Integer code;

    public String getOperate() {
        return operate;
    }

    public void setOperate(String operate) {
        this.operate = operate;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }
}

さんちゅうしゃく
注釈を使用する目的は、どの方法で注釈を使用するか、つまりこれがどの操作に属するかをマークし、注釈操作タイプと定義された列挙を組み合わせることで、どの方法でどの操作を行ったかを簡単に実現することができる.
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MonitorLog {

    /* *
     * @Author lsc
     * 

* @Param [] * @Return java.lang.String */ String value() default ""; /* * * @Author lsc *

* @Param [] * @Return int */ LogEnum operateType() default LogEnum.UNOPERATE; }

四AOP切麺
注記を接点に設定します.カットポイントをカット面に織り込んだ後、オービット通知を使用して注記されたマークアップ方法を強化すると、すべての注記操作が得られ、ログをライブラリに記録することで、ユーザーのログ操作監視を簡単に実現することができ、現在はAOPでユーザー名を取得することが提案されており、一般的なshiroフレームワークにはgetSubjectの方法でユーザー名を取得することができる.もちろん、異なる読者が使用する技術によって取得され、知識追跡者側は機能を簡単に実現するために煩雑な方法を使ってユーザー登録認証システムを実現していない.
/**
 * @Author lsc
 * 

aop

*/ @Aspect @Component public class LogAsp { /* * * @Author lsc *

* @Param [] * @Return void */ @Pointcut("@annotation(com.zszxz.annotation.MonitorLog)") public void logPointCut() { } // @Around("logPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { // LocalDateTime beginTime = LocalDateTime.now(); // Object result = point.proceed(); // LocalDateTime endTime = LocalDateTime.now(); Duration duration = Duration.between(beginTime, endTime); // long seconds = duration.getSeconds(); // saveLog(point,seconds); return result; } private void saveLog(ProceedingJoinPoint point, long seconds){ MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); // MonitorLog monitorLog = method.getAnnotation(MonitorLog.class); if (monitorLog!=null){ // LogEnum operateType = monitorLog.operateType(); // String value = monitorLog.value(); System.out.printf(" : %s , : %s ",operateType.getCode(),value); // Object[] args = point.getArgs(); try{ List objects = Arrays.asList(args); System.out.println(objects); }catch (Exception e){ } } } }

五表現層
Controllerに示すように、クエリー・ユーザーの操作を行う方法をシミュレートし、このAPIにアクセスするとAOPによってブロックされるクエリー・ユーザーの方法である注釈をメソッドに明記する.
/**
 * @Author lsc
 * 

*/ @RestController public class UserController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @MonitorLog(value=" ",operateType = LogEnum.SELECT) @GetMapping("zszxz") public String getUser(String user){ return "zszxz"; } }

知識追跡者のソースコード(コラムの説明やプリンセス番号は知識追跡者githubアドレス)を参照してください.