1. 程式人生 > >使用自定義註解+Spring AOP 實現日誌記錄

使用自定義註解+Spring AOP 實現日誌記錄

使用自定義註解+Spring切面 實現日誌記錄

在平常的專案程式設計中,我們會經常使用到日誌,用來記錄各種事件.但是,有些日誌記錄套路實在是太像了,我們不得不要寫很多遍.

比如在Spring中,我們要使用日誌記錄每個controller的訪問和結束時間,該怎麼辦呢.

下面是我認為比較簡單的一種方法: 自定義註解+Spring切面 .

下面使用SpringBoot快速搭建一個專案來進行演示.具體pom檔案檢視原始碼

  1. 建立一個Controller:
@RestController
public class HelloController {


    @RequestMapping
("/hello") @LoggerManage(logDescription = "hello") public String hello() { return "hello"; } @RequestMapping("/login/{username}/{password}") @LoggerManage(logDescription = "登陸") public String login(@PathVariable("username") String username, @PathVariable
("password") String password ) { return "登陸成功"; } }

我們要在controller的方法 hello() 上使用自定義註解以便AOP進行捕獲

  1. 自定義一個註解: LoggerManage
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoggerManage {

    public String logDescription();
}

這個註解很簡單隻有一個對方法的描述.並且這是一個方法級別的註解.

  1. 建立切面
/**
 * 日誌切面
 *
 * @author itguang
 * @create 2017-12-09 9:18
 **/
@Aspect
@Component
public class LoggerAdvice {
    private Logger logger = Logger.getLogger(this.getClass());

    @Before("within(com.itguang.springbootaop..*) && @annotation(loggerManage)")
    public void addBeforeLogger(JoinPoint joinPoint, LoggerManage loggerManage) {
        LocalDateTime now = LocalDateTime.now();

        logger.info(now.toString()+"執行[" + loggerManage.logDescription() + "]開始");
        logger.info(joinPoint.getSignature().toString());

        logger.info(parseParames(joinPoint.getArgs()));

    }

    @AfterReturning("within(com.itguang.springbootaop..*) && @annotation(loggerManage)")
    public void addAfterReturningLogger(JoinPoint joinPoint, LoggerManage loggerManage) {
        LocalDateTime now = LocalDateTime.now();
        logger.info(now.toString()+"執行 [" + loggerManage.logDescription() + "] 結束");
    }

    @AfterThrowing(pointcut = "within(com.itguang.springbootaop..*) && @annotation(loggerManage)", throwing = "ex")
    public void addAfterThrowingLogger(JoinPoint joinPoint, LoggerManage loggerManage, Exception ex) {
        LocalDateTime now = LocalDateTime.now();
        logger.error(now.toString()+"執行 [" + loggerManage.logDescription() + "] 異常", ex);
    }

    private String parseParames(Object[] parames) {

        if (null == parames || parames.length <= 0) {
            return "";

        }
        StringBuffer param = new StringBuffer("傳入引數 # 個:[ ");
        int i =0;
        for (Object obj : parames) {
            i++;
            if (i==1){
                param.append(obj.toString());
                continue;
            }
            param.append(" ,").append(obj.toString());
        }
        return param.append(" ]").toString().replace("#",String.valueOf(i));
    }


}

需要注意的是我們需要把建立的切面類標識為一個Spring可管理的Bean. 即新增@Component 註解或@Service註解都可以.

通過 JoinPoint 我們可以可到切入點的很多資訊,包括全限定名,和引數

within(): 限制連線點指定匹配的型別.

測試

現在我們的工作就做完了,我們測試下

檢視日誌輸出:

: 2017-12-09T10:45:38.194執行[hello]開始
: String com.itguang.springbootaop.web.HelloController.hello()
: 2017-12-09T10:45:38.196執行 [hello] 結束

再次檢視日誌輸出:

2017-12-09T10:54:15.516執行[登陸]開始
 String com.itguang.springbootaop.web.HelloController.login(String,String)
傳入引數 2 個:[ itguang ,123456 ]
2017-12-09T10:54:15.522執行 [登陸] 結束

之後,我們如果想記錄某個Controller裡方法的執行情況,就可以在方法上新增此註解就可以了,怎麼樣?是不是很優雅呢.

相關推薦

使用定義註解+Spring AOP 實現日誌記錄

使用自定義註解+Spring切面 實現日誌記錄 在平常的專案程式設計中,我們會經常使用到日誌,用來記錄各種事件.但是,有些日誌記錄套路實在是太像了,我們不得不要寫很多遍. 比如在Spring中,我們要使用日誌記錄每個controller的訪問和結束時間,該怎

定義註解+Spring AOP實現記錄使用者操作日誌

一、背景     專案中需要對使用者的各種操作做詳細的操作日誌記錄,需要記錄使用者操作的操作模組、具體操作以及操作的資料記錄ID等。     若寫一個方法去儲存操作,則需要每次手動去呼叫。由於是非業務性的操作,並且大量的重複操作,Spring AOP就能很好的解決這個問題。

java 定義註解 spring aop 實現註解

java自定義註解     1.幾個常用的註解解釋               @Target說明了Annotation所修飾的物件範圍:Annotation可被用於 packages、types(類、介面、列舉、Annotation型別)、型別成員(方法、構造方法、成員

基於springboot通過定義註解AOP實現許可權驗證

這篇文章主要介紹自定義註解配合AOP的使用來完成一個簡單的許可權驗證的功能。 一、移入依賴 <parent> <groupId>org.springframework.boot</groupId> <artifactId>sprin

Spring AOP實現日誌記錄(Aspect)

一、Aop術語 切面(Aspect):在Spring AOP中,切面可以使用通用類或者在普通類中以@Aspect 註解(@AspectJ風格)來實現 連線點(Joinpoint):在Spring AOP中一個連線點代表一個方法的執行 通知(Advice):在切面的某個特定的連線點(Joinp

SpringBoot定義註解AOP列印日誌

前言        在SpringBoot中使用自定義註解、aop切面列印web請求日誌。主要是想把controller的每個request請求日誌收集起來,呼叫介面、執行時間、返回值這幾個重要的資訊儲存到資料庫裡,然後可以使用火焰圖統計介面呼叫時長,平均響應時長

Spring Boot定義註解+AOP實現日誌記錄

訪問Controller列印的日誌效果如下:*********************************Request請求*************************************** ClassName : com.xxx.app.xxx.a

定義註解(二)日誌輸出:定義日誌註解+AOP實現

自定義日誌標籤YfLog 日誌註解:以日誌自定義註解+AOP實現 ####1、引入AOP Maven依賴 <!--springBoot 的aop--> <dependency> <groupId>org.springf

通過定義註解aop統一存儲操作記錄

只需要 org 一段 連接 tostring 註解 element iso boot 模塊開發完成後,接到通知需要添加操作記錄功能,看著那一堆接口,如果一個方法一個方法的加,那真是太麻煩了。為了偷懶,就百度了一下,發現可以通過自定義註解和aop的形式來統一添加操作記錄,只需

spring boot通過定義註解AOP攔截指定的請求

本文主要通過切面類和自定註解的方式,攔截指定的介面(程式碼中已經作了詳細的說明) 目錄 一 準備工作 三 切面類 五 測試結果  一 準備工作 1.1 新增依賴 通過spr

定義註解+springMVC配置攔截器記錄使用者操作的日誌.(寫入資料庫)

springMVC掃包下的分支配置檔案, 注入攔截器 攔截器的內容: (監聽儲存日誌資訊) @SuppressWarnings({"unchecked","rawtypes"}) public class CommContextInterceptor implemen

Spring Boot教程十四:基於定義註解AOP資料來源自動切換

上一篇文章講到了多資料來源的配置和手動切換,手動切換費時費力,下面我們改進一下,改成基於註解的AOP資料來源自動切換。 基礎知識不在贅述,直接上程式碼: public class DataSourceContextHolder { private static

spring boot集成aop實現日誌記錄

dst info pen reads image joinpoint 容器 asp call 1、pom依賴 <dependency> <groupId>org.springframework.boot</groupId&

定義註解AOP中的應用

以下介紹面向切面程式設計的兩種主要方式: 一、使用execution定義pointcut方式 1、定義切面 @Aspect @Component public class LogIntercept { // com.example.demo包下任意公共的(publi

Android中的定義註解(反射實現-執行時註解

預備知識: Java註解基礎 Java反射原理 Java動態代理 一、佈局檔案的註解 我們在Android開發的時候,總是會寫到setContentView方法,為了避免每次都寫重複的程式碼,我們需要使用註解來代替我們做這個事情,只需要在類Activity上

2017.12.22 定義註解AOP、攔截器

一、自定義註解(AOP切面位置) Annotation:註解 建立Annotation類 [email protected] @Target說明了Annotation所修飾的物件範圍,用@Target更準確地指出修飾的目標。 取值(Eleme

使用Spring AOP定義註解方式實現使用者操作日誌記錄

1,開發環境 作業系統:Windows 7 JDK:1.8.0_161 Eclipse:Mars.2 Release (4.5.2) 2,自定義註解類UserLog @Target({ElementType.PARAMETER, ElementType.METHOD}) @R

使用Spring Aop定義註解實現自動記錄日誌

百度加自己琢磨,以下親測有效,所以寫下來記錄,也方便自己回顧瀏覽加深印象之類,有什麼問題可以評論一起解決,不完整之處也請大佬指正,一起進步哈哈(1)首先配置檔案: <!-- 宣告自動為spring容器中配置@aspectj切面的bean建立代理 ,織入切面 --> <aop:

Spring AOP 基於註解實現日誌記錄+定義註解

一、寫一個自定義註解        註解中包括配置方法所在模組名稱,以及功能名稱,當然我們在註解裡可以自定義。import java.lang.annotation.Documented; import java.lang.annotation.ElementType; im

Spring AOP定義註解實現系統日誌記錄管理

package com.kilomob.powernetwork.managerweb.annotation; import java.lang.reflect.Method; import java.net.InetAddress; import java.util.Arrays; import java