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.カスタム注記:
2.接面プログラミング:
サービスコード:
サービス実装クラス:
Controllerコード:
* AOPはAspect Oriented Programmingの略で、断面プログラミング向け
* AOPはプログラミングモデルであり、ソフトワークの範疇に属し、開発者がプログラム構造をどのように組織するかを指導する.
* AOPは最初にAOP連盟の組織から提出され、規範を制定した.SpringはAOP思想を枠組みに導入し、AOP連盟の規範を守らなければならない.
* プリコンパイル方式とランタイムダイナミックエージェントによるプログラム機能の統一メンテナンスの技術
* AOPはOOPの継続であり、ソフトウェア開発におけるホットスポットであり、Springフレームワークにおける重要な内容でもあり、関数式プログラミングの派生モデルである.
* AOPを利用して、業務ロジックの各部分を隔離することができ、それによって業務ロジックの各部分間の結合度を低下させ、プログラムの再利用性を高め、同時に開発の効率を高めた.
以上、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;
}
}