基于注解的SpringAOP切面編程實例

1,AOP簡介

面相切面編程(AOP),可以實現(xiàn)例如日志打印、身份認證,權限管理,安全監(jiān)測。
AOP的實現(xiàn)原理是基于動態(tài)代理(Dynamic Proxy)的機制。
本文以操作日志保存為例,主要是介紹通過自定義注解,靈活配置方法是否使用切面,比如身份認證,通過增加注解,可以指定那些方法需要身份認證,實現(xiàn)更靈活使用AOP。

2,創(chuàng)建注解

import java.lang.annotation.*;

/**
 * 系統(tǒng)日志注解
 * 
 * @author Aiot_QJ
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {

    String value() default "";
}

3,日志切面

/**
 * 系統(tǒng)日志,切面處理類
 * @author Aiot_QJ
 */
@Aspect
@Component
public class SysLogAspect {
    @Autowired
    private SysLogService sysLogService;
    
    @Pointcut("@annotation(SysLog)")
    public void logPointCut() { 
        
    }
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        long beginTime = System.currentTimeMillis();
        //執(zhí)行方法
        Object result = point.proceed();
        //執(zhí)行時長(毫秒)
        long time = System.currentTimeMillis() - beginTime;
        //保存日志
        saveSysLog(point, time);
        return result;
    }
    private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        SysLog sysLog = new SysLog();
        com.pcidata.common.annotation.SysLog syslog = method.getAnnotation(com.pcidata.common.annotation.SysLog.class);
        if(syslog != null){
            //注解上的描述
            sysLog.setOperation(syslog.value());
        }
        //請求的方法名
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        sysLog.setMethod(className + "." + methodName + "()");
        //請求的參數(shù)
        Object[] args = joinPoint.getArgs();
        try{
            String params = new Gson().toJson(args[0]);
            sysLog.setParams(params);
        }catch (Exception e){

        }
        //獲取request
        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
        //設置IP地址
        sysLog.setIp(IPUtils.getIpAddr(request));
        //用戶名
        String username = ((SysUserEntity) SecurityUtils.getSubject().getPrincipal()).getUsername();
        sysLog.setUsername(username);
        sysLog.setTime(time);
        sysLog.setCreateDate(new Date());
        //保存系統(tǒng)日志
        sysLogService.insert(sysLog);
    }
}

4,接口使用

    @SysLog("hello world")
    @RequestMapping("/hello")
    public String hello(@RequestBody String msg){
        return "hello world"+msg;
    }

總結

通過SpringAOP+注解,可以靈活記錄重要接口的日志信息到數(shù)據(jù)庫,方便進行日志分析和統(tǒng)計。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風情閱讀 1,856評論 0 3
  • 前言 上一章節(jié),介紹了目前開發(fā)中常見的log4j2及l(fā)ogback日志框架的整合知識。在很多時候,我們在開發(fā)一個系...
    oKong閱讀 1,005評論 0 12
  • springAop:面向切面的編程 應用場景:權限控制、事物管理、日志打印等等,就是在不同的方法中重復用到相同的代...
    HJJ_3c00閱讀 442評論 0 0
  • 1.什么是spring?Spring是個java企業(yè)級應用的開源開發(fā)框架。Spring主要用來開發(fā)Java應用,但...
    壹點零閱讀 472評論 0 4
  • 歷史不能忘卻,12月13日國家公祭。 這段歷史離我們不遠,我的媽媽經(jīng)常給我講故事,講述那個年代日本人的可怕,事情就...
    芝麻紅豆葵花子閱讀 138評論 0 2

友情鏈接更多精彩內容