I.はじめに
我々はすべて知っているように、春は2つの機能とAOPのIOCのコア、すなわちアスペクト指向と制御の反転です。この記事では、プロセス指向の原則の側面を実装AOP SpringBootを使用する方法についてお話します。
第二に、AOPは何ですか
AOPフルネームはAspect Oriented Programming
、アスペクト指向、AOPの主な目的は、ビジネス・プロセス・セクションの抽出のために達成され、部分の間にロジックローの間の結合を得るために、特定のステップ又は段階プロセスに直面していますアイソレーションの。その完了し、デザインパターンと同様のタスクは、オブジェクト指向プログラミングの不足を補うためのプログラムの構造を考えるために別の角度を提供することです。
人気話すが、このように、それはこの結合にいくつかの特別なロジックを達成するためのエントリポイントを介して結合サービスにもサービス操作セクションで定義され、達成するための注入部にサービスを提供するためのメカニズムを提供することですビジネス。
栗の場合は、プロジェクトがレコード操作のログを要求、またはプロセスの変更は、変更履歴を記録している、プラグ手術台以上の何物でもありません、非常に簡単な操作を保存、ロギングやその他の補助的なコードの一部です。何度も何度も、コールを書き換えます。時間の無駄、プロジェクトを回すだけでなく、それはろうそくの価値がない、より冗長になります。
アスペクト指向AOPので、我々はプレーする必要があります。
三、AOP相対的な用語。
SpringBootはAOPの統合を達成するために理解するために、我々は最初の名前の実装のいくつかのためにAOPのセクションを理解し、または霧である必要があります。
セクション(アスペクト):懸念のモジュラーポイント。@Aspectクラスの上にノートの形で、セクションを宣言します。
接続点(ジョインポイント):このような方法または例外の処理が結合点であってもよい場合など、特定の点におけるプログラムの実行、中。
お知らせ(アドバイス):通知の強化は、それはあなたがそれをして行くために必要とされる場所は良い定義とするなど、そのような事項、ログ、ビジネス・ロジックを記述する必要があるということです、通知が行われる必要があると呼ばれます。
アラウンド前、後、AfterReturning、AfterThrowing、:5つのノートを含みます。
@Before:カットポイント法の前に実行されます。
@After:メソッドは接線の点の後に実行されます
@AfterReturning:行うのカットポイント還元方法の後
@AfterThrowing:カット点法は、エラーの実行を投げます
@Around:この注釈で、実行後、実行前にカットオフ点を制御することができる機能拡張を囲むように属し、プログラムが例外をスローし、これは、コメントを@AfterThrowing影響します
カットオフ点(ポイントカット):実際にスクリーニング接続点、マッチアサーションの接続点は、クラスの全てのメソッドは、接続ポイントがあるが、すべての必要はなく、それが接続点としてカットオフ点の一部を除外します。通知部は、アクションまたは実行タイミングを定義した場合、カットオフポイントは、実行の場所を定義します。どのようにポイントカット式との接続点マッチングは、AOPの中心である:春は、AspectJのポイントカットデフォルトの構文を使用しています。
紹介(紹介):既存のクラスのコードを変更せずに、彼らは新しい動作や状態を持っているということを前提に入力することができ、従来のを修正することなく、クラスのプロパティとメソッドを追加します。実際には、セクションは:行くために(つまり、定義された新しい通知方法の属性である)ターゲットクラスを使用します。
聴衆(ターゲットオブジェクト):オブジェクトは、1つのまたは複数の面に通知します。また、通知(adviced)オブジェクトと呼びます。スプリングAOPプロキシを実行することによって達成されるので、このオブジェクトは、プロキシ(プロキシ)オブジェクトであることが常にあります。
AOPプロキシ(プロキシAOP) :アスペクト契約(ようにアドバイスメソッドの実行など)を実装するためにAOPフレームワークによって作成されたオブジェクト。春では、AOPプロキシはJDK動的プロキシまたはプロキシCGLIBあろう。
(ウィービング)織り:他のアプリケーション・タイプまたはオブジェクトと側面を、そして通知するオブジェクトを作成します。これらは、コンパイル時間(例えば、AspectJのコンパイラを使用して)、ロード時間、および実行時であってもよいです。春と他の純粋なJavaのAOPフレームワークは、実行時に織り行います。
一つの重要な名詞:セクション(アスペクト)、エントリポイント(ポイントカット)
第四に、コードの実装
プロセスログにビジネスロジック、例えば、処理のための新しいログ処理部。
1. Mavenを頼りに追加
<!--引入AOP依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
2.システムログメモを追加
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}
3.システムログエンティティクラスを追加します。
@Data
public class SysLogEntity {
private String className;
private String methodName;
private String params;
private Long exeuTime;
private String remark;
private String createDate;
}
4.新しいサービス・ロジック層
@Slf4j
@Service
public class SysLogService {
public boolean save(SysLogEntity sysLogEntity){
// 这里就不做具体实现了
log.info(sysLogEntity.getParams());
return true;
}
}
ここでは、@のSLF4Jログリアクション
同等の民間最終ロガーロガー= LoggerFactory.getLogger(XXX.class)。
〜どのように簡素化する方法を、コードを簡素化
ここでは、具体的にコード・サービス層を作成していない、どのように達成するかのAOPを研究することです。
5.Controller層
@RestController
@RequestMapping("/aop")
public class AopController {
@SysLog("测试")
@GetMapping("/test")
public String test(@RequestParam("name") String name, @RequestParam("age") int age){
return name + ", " + age;
}
}
前記処理部
わずかに少し、少しキー処理は、次のコードKeguanへ
まず、クラス宣言の上で
@Aspect //使用@Aspect
@Component
サービスコールサービス
@Autowired
private SysLogService sysLogService;
カットオフ点の表現を追加@Pointcut
/**
* 这里我们使用注解的形式
* 当然,我们也可以通过切点表达式直接指定需要拦截的package,需要拦截的class 以及 method
* 切点表达式: execution(...)
*/
@Pointcut("@annotation(com.niaobulashi.anno.SysLog)")
public void logPointCut() {}
アドバイスの周りに追加@Around
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
Object result = point.proceed();
long time = System.currentTimeMillis() - beginTime;
try {
//实现保存日志逻辑
saveLog(point, time);
} catch (Exception e) {
}
return result;
}
論理SAVELOGを達成するために、ログを保存します
private void saveLog(ProceedingJoinPoint joinPoint, long time) {
// 获取方法的关键信息,类,包
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SysLogEntity sysLogEntity = new SysLogEntity();
sysLogEntity.setExeuTime(time);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
sysLogEntity.setCreateDate(dateFormat.format(new Date()));
SysLog sysLog = method.getAnnotation(SysLog.class);
if(sysLog != null) {
//注解上的描述
sysLogEntity.setRemark(sysLog.value());
}
//请求的 类名、方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
sysLogEntity.setClassName(className);
sysLogEntity.setMethodName(methodName);
//请求的参数
Object[] args = joinPoint.getArgs();
try {
List<String> list = new ArrayList<String>();
for (Object o : args) {
list.add(o.toString());
}
sysLogEntity.setParams(list.toString());
} catch (Exception e){
}
sysLogService.save(sysLogEntity);
}
MethodSignature主な成果は、の形式で戻り値のクラス、メソッド名とパラメータであります
ファイブテスト
127.0.0.1:8081 / AOP /テスト名=トム&年齢= 18 GETリクエストを送信することにより?
同時に、パラメータのRBIを確認し、デバッグモードでプロジェクトを実行
あなたは、パラメータを見ることができますMethodSignature
そして、様々なパラメータsysLogEntity割り当て。
VIの概要
1、横断的関心事の
方法は、傍受に対処する方法を、これらの懸念は、横断的関心事と呼ばれるインターセプト
図2に示すように、セクション(アスペクト) - >(+通知接点)は
、抽象横断懸念のセクションオブジェクトの抽象的な特徴です。
お知らせ+カットオフポイントは、
すべての場所は、(アドバイス)コードを強化するために適用されることを意味します。(位置情報法を含みます)
3、连接点(joinpoint)->(被拦截的方法)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut)->(描述拦截那些方法的部分)
对连接点进行拦截的定义
5、通知(advice)->(拦截后执行自己业务逻辑的那些部分)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
这玩意也叫 增强
在逻辑层次上包括了我们抽取的公共逻辑和方位信息。因为Spring只能方法级别的应用AOP,也就是我们常见的before,after,after-returning,after-throwing,around五种,意思就是在方法调用前后,异常时候执行我这段公共逻辑呗。