Spring+AOP+Log4j 用註解的方式記錄指定某個方法的日誌

来源:http://www.cnblogs.com/qiuren/archive/2016/11/16/6068518.html
-Advertisement-
Play Games

一、spring aop execution表達式說明 在使用spring框架配置AOP的時候,不管是通過XML配置文件還是註解的方式都需要定義pointcut"切入點" 例如定義切入點表達式 execution(* com.sample.service.impl..*.*(..)) executi ...


一、spring aop execution表達式說明

在使用spring框架配置AOP的時候,不管是通過XML配置文件還是註解的方式都需要定義pointcut"切入點"

例如定義切入點表達式 execution(* com.sample.service.impl..*.*(..))

execution()是最常用的切點函數,其語法如下所示:

 整個表達式可以分為五個部分:

 1、execution(): 表達式主體。

 2、第一個*號:表示返回類型,*號表示所有的類型。

 3、包名:表示需要攔截的包名,後面的兩個句點表示當前包和當前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。

 4、第二個*號:表示類名,*號表示所有的類。

 5、*(..):最後這個星號表示方法名,*號表示所有的方法,後面括弧裡面表示方法的參數,兩個句點表示任何參數。

二、程式

1.要記錄日誌的某個方法: updatePromote

/**
     * 修改商品活動
     * @param vo
     * @param promoteId為,AOP監控的查詢ID
     * @return
     * @throws Exception
     */
    public ResultVO updatePromote(PromoteVO vo,Long promoteId)throws Exception;

2.增加一個橫切關註點,列印日誌,Java類為

package com.fortis.drugstore.web.userdbThrift.aop;

import java.util.Date;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
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.stereotype.Component;
import com.fortis.drugstore.base.action.BaseAction;
import com.fortis.drugstore.system.utils.SessionInfo;
import com.fortis.drugstore.web.userdbThrift.activity.service.PromoteService;
import com.fortis.thrift.userdb.PromoteVO;
//聲明這是一個組件
@Component
//聲明這是一個切麵Bean
@Aspect
public class ServiceAspect extends BaseAction<Object>{
    private static final long serialVersionUID = 7690224540336380592L;
    private final static Logger log = Logger.getLogger(ServiceAspect.class);
    @Autowired
    private PromoteService service;
    
    //配置切入點,該方法無方法體,主要為方便同類中其他方法使用此處配置的切入點
    @Pointcut("execution(* com.fortis.drugstore.web.userdbThrift.activity.service.impl..PromoteServiceImpl.updatePromote(..))")
    public void aspect(){    }
    /*
     * 配置前置通知,使用在方法aspect()上註冊的切入點
     * 同時接受JoinPoint切入點對象,可以沒有該參數
     */
    @Before("aspect()")
    public void before(JoinPoint joinPoint){
        PromoteVO obBefore = new PromoteVO();
        Object []param = joinPoint.getArgs();
        if(log.isInfoEnabled()){
            Object promoteId = param[1]; //切點中有兩個參數,第二個為表的主鍵,用於查詢
            SessionInfo sessionInfo = (SessionInfo) getSession().getAttribute("sessionInfo");
            try {
                obBefore = service.queryPromoteDetail(Long.valueOf(promoteId.toString()));
            } catch (Exception e) {
                e.printStackTrace();
            }
            log.info("【修改活動數據】:"+new Date()+" 【賬號】:"+sessionInfo.getUserAcct()+" 【名稱】:"+sessionInfo.getUserName());
            log.info("修改之前:"+obBefore.toString());
        }
    }
    
    //配置後置通知,使用在方法aspect()上註冊的切入點
    @After("aspect()")
    public void after(JoinPoint joinPoint){
        PromoteVO obAfter = new PromoteVO();
        Object []param = joinPoint.getArgs();
        if(log.isInfoEnabled()){
            Object promoteId = param[1];
            try {
                obAfter = service.queryPromoteDetail(Long.valueOf(promoteId.toString()));
            } catch (Exception e) {
                e.printStackTrace();
            }
            log.info("修改之後:"+obAfter.toString());
        }
    }
    
}

3.spring aop的配置文件 spring-aop.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:c="http://www.springframework.org/schema/c" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- 激活自動代理功能 -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    
</beans>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Python地鐵的到站流程及原理(個人理解) 今天坐地鐵看著站牌就莫名的想如果用Python寫其工作原理 是不是很簡單就小試牛刀了下大佬們勿噴純屬小弟個人理解 首先來看看地鐵上顯示的站牌如下: 就想這首先站點固定的名稱固定的站點名稱長度可知道,這不是符合列表嘛[第一站,第二站,。。。,最後一站] 把 ...
  • 英文文檔: staticmethod(function) Return a static method for function. A static method does not receive an implicit first argument. The @staticmethod form ...
  • 英文文檔: sorted(iterable[, key][, reverse]) Return a new sorted list from the items in iterable. Has two optional arguments which must be specified as ke ...
  • 變數分為哪些 成員變數:類裡面,方法外面定義的變數 + 實例變數:沒有用static修飾的變數,屬於對象;存在期:創建實例~銷毀實例;作用域:與該實例的生存範圍相同 + 類變數:用static修飾的變數,屬於類;存在期:類的準備階段~銷毀該類;作用域:與類的生存範圍相同 局部變數: + 形參:方法簽 ...
  • ...
  • elasticsearch的config文件夾裡面有兩個配置文件:elasticsearch.yml和logging.yml,第一個是es的基本配置文件,第二個是日誌配置文件,es也是使用log4j來記錄日誌的,所以logging.yml里的設置按普通log4j配置文件來設置就行了。下麵主要講解下e ...
  • 個人理解: spring Aop 是什麼:面向切麵編程,類似於自定義攔截操作,支持攔截之前操作@Before,攔截之後操作@After,攔截環繞操作@Around。 什麼情況下使用spring Aop:舉例如下 code案例: applicationContext.xml 配置文件 maven po ...
  • 方法屬於誰 方法要麼屬於類,要麼屬於對象 static修飾的方法屬於類 沒有static修飾的方法屬於對象 方法只能定義在類裡面,不能獨立定義 不能獨立的執行方法,要麼通過類調用,要麼通過方法調用 一個類里,一個方法調用另一個方法,看似沒有調用者,實際上對於非static方法使用this調用,sta ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...