使用自定義註解+Spring AOP 實現日誌記錄
使用自定義註解+Spring切面 實現日誌記錄
在平常的專案程式設計中,我們會經常使用到日誌,用來記錄各種事件.但是,有些日誌記錄套路實在是太像了,我們不得不要寫很多遍.
比如在Spring中,我們要使用日誌記錄每個controller的訪問和結束時間,該怎麼辦呢.
下面是我認為比較簡單的一種方法: 自定義註解+Spring切面 .
下面使用SpringBoot快速搭建一個專案來進行演示.具體pom檔案檢視原始碼
- 建立一個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進行捕獲
- 自定義一個註解: LoggerManage
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoggerManage {
public String logDescription();
}
這個註解很簡單隻有一個對方法的描述.並且這是一個方法級別的註解.
- 建立切面
/**
* 日誌切面
*
* @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