[AOP]JoinPointとバインド変数


Spring JoinPointが提供する方法
Signature getSignature()
  • クライアント呼び出しメソッドのフラグ(戻りタイプ、名前、パラメータ)情報を含む署名オブジェクト
  • を返す.
    Object getTarget()
  • は、クライアント呼び出しのビジネスメソッドを含むビジネスオブジェクト(クラスオブジェクトを返す)
  • を返す.
    Object[] getArgs()
  • クライアントがメソッドを呼び出すときに渡すパラメータのリストをオブジェクト配列
  • に返す.
    Aroundデバイスメソッドを実装する際に使用するProcedinJoinPointインタフェースはJoinPointを継承するクラスである.
    これにより、JoinPointが所有するすべてのメソッドがサポートされ、「継続」()メソッドが追加されます.
    なお、JoinPointのパラメータとしてBefor、After Returning、After Throwing、After Advisorを使用し、Around AdvisorでのみProcedinPointを使用します.Around Advisorで()メソッドを続けるだけなので.
    署名オブジェクトの提供方法
    String getName()
  • クライアントが呼び出すメソッド名は
  • を返す.
    String toLongString()
    パケットパスを含む
  • クライアントが呼び出すメソッドのタイプ、名前、およびパラメータを返します.
    String toShortString()
  • クライアント呼び出しメソッドに戻る略語文字列
  • 1.前置詞
    @Before("cut() && enableDecode()")
        public void before(JoinPoint joinPoint) throws UnsupportedEncodingException{
    
            Object[] args = joinPoint.getArgs();
            String methodName = joinPoint.getSignature().getName();
    
            for(Object arg : args){
                if(arg instanceof User){
                    User user = User.class.cast(arg);
                    String base64Email = user.getEmail();
                    String email = new String(Base64.getDecoder().decode(base64Email), "UTF-8");
                    user.setEmail(email);
                }
            }
    
            System.out.println("실행된 메소드명: " + methodName);
    
        }
    2.アフターサービス設備
    @AfterReturning(value = "pointcut() && enableDecode()", returning = "returnObj")
        public void afterReturn(JoinPoint joinPoint, Object returnObj){
            if(returnObj instanceof User){
                User user = User.class.cast(returnObj);
                String email = user.getEmail();
                String base64Email = Base64.getEncoder().encodeToString(email.getBytes());
                user.setEmail(base64Email);
            }
        }

  • 2番目のパラメータは、バインド変数であるObjectタイプのReturnObjectを宣言します.
    バインド変数は、ビジネス・メソッドが返す結果値をバインドするために使用されます.返される値が何であるか分からないため、タイプはObjectとして宣言されます.

  • @AfterReturningのreturn値は、2番目のパラメータ名と一致します.
  • 3.After Throwing Advisor
    @AfterThrowing(value = "pointcut() && enableDecode()", throwing = "exceptObj")
        public void afterThrowing(JoinPoint joinPoint, Exception exceptObj){
    
            String method = joinPoint.getSignature().getName();
            String errMsg = exceptObj.getMessage();
    
            System.out.println("메소드명: " + method);
            System.out.println("ErrMsg: " + errMsg);
    
        }
  • 第2パラメータ取得Exception情報
  • @AfterThrowing内の投げ値は2番目のパラメータ名と一致しています.
  • ハブ
    @Around("pointcut() && enableDecode()")
        public Object around(ProceedingJoinPoint joinPoint){
            String method = joinPoint.getSignature().getName();
    
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            System.out.println("around 시작");
            
            Object obj = joinPoint.proceed();
            
            stopWatch.stop();
            System.out.println("around 메소드명: " + method + "수행에 걸린 시간: " + stopWatch.getTotalTimeMillis() + "(ms)초");
            
            return obj;
        }