AOP
以下のためのアスペクト指向プログラミングの略語
あらかじめコンパイラや実行時の動的エージェントプログラムを介して、アスペクト指向プログラミングは、統一されたメンテナンスを達成するための技術を採用しています。(もっと単刀直入に言えば:私たちは本来の機能に影響を与えずに、ソフトウェアのできる規模。ファンクション)は
その後、誰かが聞いてきます、それの横行拡大は何ですか???
A:ソフトウェア開発は、「ビジネス層」、コントローラ層「、「持続性」に分けることができます。
「横」、いわゆる上記の層に3層のいずれかを意味します!
レベル内のすべてのメソッドと同時に作用することができる方法を使用して、AOP技術を使用した後。
あなたは、AOPの言葉基本的な理解を理解することができるようになります!
AOPは、確かにそれは最終的にそれの利点は何であるコア春、の一つとして、非常に精通している必要があり?
モジュール間の結合を減少させる1.
システムの2.容易膨張
3. Aより良いコードの再利用
AOPシナリオ
1.ログ処理
2.ユーザーのログイン
3.著作権管理(認証)
4.パフォーマンス最適化(パフォーマンスの最適化)
5.トランザクション(取引)
6.記録トラックの写真(ログ、トレースプロファイリングおよび監視 )
などが挙げられます。。。
春AOPのログを使用するには?
AOPすべての要求がすべてのクライアントに送信することができますインターセプト、および印刷要求アドレス、インターフェースの名前、パラメータ値、メソッドの実行時間
依存AOP 1の導入
<!--spring-aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.定義セクションクラス
package com.xf.logistics.logisticsadmin.config;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.NamedThreadLocal;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
/**
* aop切面类
* @author xufan
* Aspect:标注该类为切面类 (@Aspect注解方式可以实现前置通知、返回通知、后置通知、异常通知、环绕通知。)
* Component:把切面类加入到IOC容器中
*/
@Slf4j
@Aspect
@Component
public class LogAspect {
private static final ThreadLocal<Date> beginTimeThreadLocal = new NamedThreadLocal<>("ThreadLocal beginTime");
@Autowired(required = false)
private HttpServletRequest request;
// @Autowired
//private CustomLogDao customLogDao; //引入dao层接口,目的是为了让日志持久化
/**
* PointCut表达式 :(切入点)切入到controller层,所有controller接口都进行切入 ,execution(要拦截的类路径)
*/
@Pointcut("execution(* com.xf.logistics.web.*Controller.*(..))")
public void controllerAspect() {
log.info("controllerAspect");
}
/**
* 前置通知 (在方法执行之前返回)用于拦截Controller层记录用户的操作的开始时间
*
* @param joinPoint 切点
* @throws InterruptedException
*/
@Before("controllerAspect()")
public void doBefore(JoinPoint joinPoint) throws InterruptedException {
//线程绑定变量(该数据只有当前请求的线程可见)
Date beginTime = new Date();
beginTimeThreadLocal.set(beginTime);
}
/**
* 后置通知(在方法执行之后返回) 用于拦截Controller层操作
*
* @param joinPoint 切点
*/
@After("controllerAspect()")
public void after(JoinPoint joinPoint) {
try {
log.info("\nRequestURI={},Method={},\nParameterMap={},Cost={}",
//请求路径URI
request.getRequestURI(),
//请求方法名称
request.getMethod(),
//获取参数数组
JSONObject.toJSONString(Arrays.toString(joinPoint.getArgs())),
System.currentTimeMillis() - beginTimeThreadLocal.get().getTime());
//执行日志入库操作
}catch (Exception e){
log.error(e.getMessage());
}
}
}
インタフェース制御層をテストする3.スタートプロジェクト
郵便配達依頼使って
、あなたが私たちの要求を見つけます。4.レビューコンソールは、傍受された、および関連する情報が記録されています
概要
使用AOPは、我々はすべてのログを処理できる方法を使用します!