JavaがAOP接面を利用してカスタム注釈を実現する例

6853 ワード

AOPとは?
    * AOPはAspect Oriented Programmingの略で、断面プログラミング向け
    * AOPはプログラミングモデルであり、ソフトワークの範疇に属し、開発者がプログラム構造をどのように組織するかを指導する.
    * AOPは最初にAOP連盟の組織から提出され、規範を制定した.SpringはAOP思想を枠組みに導入し、AOP連盟の規範を守らなければならない.
    * プリコンパイル方式とランタイムダイナミックエージェントによるプログラム機能の統一メンテナンスの技術
    * AOPはOOPの継続であり、ソフトウェア開発におけるホットスポットであり、Springフレームワークにおける重要な内容でもあり、関数式プログラミングの派生モデルである.
    * AOPを利用して、業務ロジックの各部分を隔離することができ、それによって業務ロジックの各部分間の結合度を低下させ、プログラムの再利用性を高め、同時に開発の効率を高めた.
  • AOPの役割と優位性は何ですか?
  • の役割:
  • AOPは、従来の縦継承システムの重複コード(パフォーマンス監視、トランザクション管理、セキュリティチェック、キャッシュ)
  • に代わる横抽出メカニズムを採用している.
  • プログラムの実行中に、ソースコードを変更することなく既存の方法を強化する
  • .
  • ビジネスロジックとシステム処理のコード(接続、トランザクション管理、オペレーションログ記録を閉じる)を
  • にデカップリングする.
  • のメリット:
  • 重複コードを減らす
  • 開発効率の向上
  • メンテナンスが便利

  • AOP関連用語紹介
  • 1.Joinpoint(接続点)   -- 接続点とは、ブロックされた点を指す.Springでは、springはメソッドタイプの接続点2.Pointcut(切り込み点)のみをサポートするため、これらの点はメソッドを指す.        -- 切り込みポイントとは、どのJoinpointをブロックするかの定義3.Advice(通知/拡張)    -- 通知とは、Joinpointをブロックした後に行うべきことを通知することである.通知は、前置通知、後置通知、異常通知、最終通知、周回通知(切断面で完了する機能)4.Introduction(紹介)--紹介とは、クラスコードを変更しない前提で、Introductionが実行期間中にクラスに動的にいくつかの方法やField 5.Target 5を追加できる特殊な通知である.(ターゲットオブジェクト)     -- エージェントのターゲットオブジェクト6.Weaving(織り込み)      -- 強化をターゲットオブジェクトに適用して新しいエージェントオブジェクトを作成するプロセス7.Proxy(エージェント)        -- 1つのクラスがAOPに織り込まれて強化されると、結果エージェントクラス8.Aspect(接面)が生成される.           -- 切り込み点と通知の結合で、後で私達自身が編纂して配置する
  • です

    以上、Spring AOPドキュメントから抜粋しました!
    ソースの例:
     
    1.カスタム注記:
    package com.example.demo.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AnnotationDemo {
    
        String remark() default "";
    
        String type() default "QUERY";
    }

    2.接面プログラミング:
    package com.example.demo.aspect;
    
    import com.alibaba.fastjson.JSON;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    @Component //   spring  
    @Aspect     //  
    public class AspectDemo {
    
        /**
         *     (         &&,||,!     ):
         *      execution:      :execution(* com.example.demo.*(..))--com.example.demo        
         *      within:      
         *      this:   AOP      
         *      target:         
         *      args:        
         *      bean:     bean  ,       (Spring   )
         *      @target:          
         *      @args:                 
         *      @within:           
         *      @annotation:          
         * 
    * : TODO
    * ${tags} */ @Pointcut("@annotation(com.example.demo.annotation.AnnotationDemo)") public void asAnnotation() {} /** * : * AnnotationDemo * , BeforeAdvice . *
    * : TODO
    * ${tags} */ @Before("asAnnotation()") public void beforeRun() { System.out.println(" AnnotationDemo "); } /** * : * @Around , MethodInterceptor, @AnnotationDemo , * ProceedingJoinPoint: *
    * : TODO
    * ${tags} */ @Around("asAnnotation() && @annotation(annotationDemo)") public Object around(ProceedingJoinPoint joinPoint,AnnotationDemo annotationDemo) { Object obj = null; try {   // AnnotationDemo annotationDemo.remark(); Object[] args = joinPoint.getArgs(); String arg = JSON.toJSONString(args); System.out.println(" :"+ arg); Signature signature = joinPoint.getSignature(); // package String methodUrl = signature.getDeclaringTypeName(); // , package String method = signature.getName(); System.out.println(" " + method + " , :" + methodUrl); // obj ,joinPoint.proceed , obj = joinPoint.proceed(args); } catch (Throwable throwable) { throwable.printStackTrace(); } System.out.println(" "); return obj; } /** * : * AnnotationDemo * final , 。 * @AfterReturning: , AfterReturningAdvice, . * @AfterThrowing: , ThrowsAdvice. *
    * : TODO
    * ${tags} */ @AfterReturning(returning = "obj", Pointcut = "asAnnotation()") public void after(Object obj) { System.out.println(" AnnotationDemo "); logger.info(" ,Result:{}", JSON.toJsonString(obj)); } }

    サービスコード:
    public interface UserService {
    
        /**
         *     :   userId      
    * : TODO
    * ${tags} */ UserEntity getUser(Map map); }

    サービス実装クラス:
    package com.example.demo.service.impl;
    
    import com.example.demo.entity.UserEntity;
    import com.example.demo.reflect.ReflectUtil;
    import com.example.demo.service.UserService;
    import org.springframework.stereotype.Service;
    
    import java.util.Map;
    
    @Service
    public class UserServiceImpl implements UserService {
    
    
        @Override
        public UserEntity getUser(Map map) {
            // ReflectUtil    Java         ,      :https://blog.csdn.net/MrQin1/article/details/96486851
            return (UserEntity) ReflectUtil.getObject(UserEntity.class, map);
        }
    
    
    }
    

    Controllerコード:
    package com.example.demo.controller;
    
    import com.example.demo.annotation.AnnotationDemo;
    import com.example.demo.entity.UserEntity;
    import com.example.demo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
    
        @AnnotationDemo(remark = "  userId      ")
        @PostMapping("/getUser")
        public UserEntity getUser() {
            Map map = new HashMap<>();
            map.put("userId", 110);
            map.put("userName", "   ");
            map.put("userSex", "man");
            map.put("userAge", 99);
            UserEntity userEntity = userService.getUser(map);
            return userEntity;
        }
    }