Spring AOP日誌管理

来源:http://www.cnblogs.com/haaron/archive/2016/01/13/5127835.html
-Advertisement-
Play Games

AOP的介紹AOP(Aspect-OrientedProgramming,面向方面編程)AOP的幾個概念1.切麵(Aspect):切麵就是一個關註點的模塊化,如事務管理、日誌管理、許可權管理等;2.連接點(Joinpoint):程式執行時的某個特定的點,在Spring中就是一個方法的執行;3.通知(A...


AOP的介紹

AOPAspect-OrientedProgramming,面向方面編程)

AOP的幾個概念

1.切麵(Aspect):切麵就是一個關註點的模塊化,如事務管理、日誌管理、許可權管理等;

2.連接點(Joinpoint):程式執行時的某個特定的點,在Spring中就是一個方法的執行;

3.通知(Advice):通知就是在切麵的某個連接點上執行的操作,也就是事務管理、日誌管理等;

4.切入點(Pointcut):切入點就是描述某一類選定的連接點,也就是指定某一類要織入通知的方法;

5.目標對象(Target):就是被AOP動態代理的目標對象;

這裡使用登錄功能做日誌管理案例

概要

1LoginService LogService TestMain

2)用Spring 管理 LoginService LogService 的對象

3)確定哪些連接點是切入點,在配置文件中

4)將LogService封裝為通知

5)將通知植入到切入

6)客戶端調用目標點

Step1 新建登錄業務介面以及實現類

package com.aaron.log; 
/** 

 * @Author Aaron 

 * @Date創建時間:2016-1-13 

 * @Version 1.0  

 * 

 * @Project_Package_Description SpringQuartzDemo || com.aaron.log 

 * @Function_Description登錄業務邏輯

* 

 */ 

public interface ILoginService { 
public boolean login(String name, String password); 
} 

 

package com.aaron.log; 
/** 

 * @Author Aaron 

 * @Date創建時間:2016-1-13 

 * @Version 1.0  

 * 

 * @Project_Package_Description SpringQuartzDemo || com.aaron.log 

 * @Function_Description登錄業務邏輯介面實現類

* 

 */ 

public class LoginServiceImpl implements ILoginService { 
public boolean login(String userName, String password) { 
 System.out.println("用戶登錄信息:" + userName + "," + password); 
return true; 
 } 
}

Step2 新建日誌管理介面以及實現類

 

package com.aaron.log; 
import org.aspectj.lang.JoinPoint; 
/** 

 * @Author Aaron 

 * @Date創建時間:2016-1-13 

 * @Version 1.0  

 * 

 * @Project_Package_Description SpringQuartzDemo || com.aaron.log 

* @Function_Description日誌介面

* 

 */ 

public interface ILogService { 

//無參的日誌方法
public void beforeLog(); 

//有參的日誌方法
public void Log(JoinPoint point); 

//有參有返回值的方法
public void afterLog(JoinPoint point,Object returnObj); 

} 
package com.aaron.log; 
import org.aspectj.lang.JoinPoint; 
/** 

 * @Author Aaron 

 * @Date創建時間:2016-1-13 

 * @Version 1.0 

 *  

 * @Project_Package_Description SpringQuartzDemo || com.aaron.log 

 * @Function_Description記錄日誌介面實現類

*  

 */ 

public class LogServiceImpl implements ILogService { 
    // 無參方法
    public void beforeLog() { 
        System.out.println("*************開始記錄日誌*******************"); 
    } 

    // 有參無返回值的方法
    public void Log(JoinPoint point) { 
        // 此方法返回的是一個數組,數組中包括request以及ActionCofig等類對象
        Object[] args = point.getArgs(); 
        System.out.print("目標參數列表:"); 
        for (Object obj : args) { 
            System.out.print(obj + ","); 
        } 
        System.out.println(); 
    }  

    // 有參並有返回值的方法

    public void afterLog(JoinPoint point, Object returnObj) { 
        // 此方法返回的是一個數組,數組中包括request以及ActionCofig等類對象
        Object[] args = point.getArgs(); 
        System.out.print("目標參數列表:"); 
        for (Object obj : args) { 
            System.out.print(obj + ","); 
        } 
        System.out.println(); 
        System.out.println("執行結果是:" + returnObj); 
        System.out.println("*************結束記錄日誌*******************"); 
    } 
} 

Step3 在applicationContext.xml文件中配置AOP

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 

    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

    xmlns:p="http://www.springframework.org/schema/p" 

    xsi:schemaLocation="http://www.springframework.org/schema/beans  

 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 

 http://www.springframework.org/schema/aop  

 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 

    <!-- 啟動觸發器的配置開始 --> 

    <bean name="startQuertz" lazy-init="false" autowire="no" 

        class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 

        <property name="triggers"> 

            <list> 

                <ref bean="myJobTrigger" /> 

            </list> 

        </property> 

    </bean> 

    <!-- 啟動觸發器的配置結束 --> 

 

    <!-- 調度的配置開始 --> 

    <!-- quartz-1.8以前的配置 <bean id="myJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  

        <property name="jobDetail"> <ref bean="myJobDetail" /> </property> <property  

        name="cronExpression"> <value>0/1 * * * * ?</value> </property> </bean> --> 

    <!-- quartz-2.x的配置 --> 

    <bean id="myJobTrigger" 

        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 

        <property name="jobDetail"> 

            <ref bean="myJobDetail" /> 

        </property> 

        <property name="cronExpression"> 

            <value>0 0/1 * * * ?</value> 

        </property> 

    </bean> 

    <!-- 調度的配置結束 --> 

 

    <!-- job的配置開始 --> 

    <bean id="myJobDetail" 

        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 

        <property name="targetObject"> 

            <ref bean="myJob" /> 

        </property> 

        <property name="targetMethod"> 

            <value>work</value> 

        </property> 

    </bean> 

    <!-- job的配置結束 --> 

 

    <!-- 工作的bean --> 

    <bean id="myJob" class="com.tgb.lk.demo.quartz.MyJob" /> 

 

    <bean id="logService" class="com.aaron.log.LogServiceImpl"></bean> 

    <bean id="loginService" class="com.aaron.log.LoginServiceImpl"></bean> 

    <aop:config> 

        <!-- 切入點 --> 

        <aop:pointcut expression="execution(* com.aaron.log.LoginServiceImpl.*(..))" 

            id="myPointcut" /> 

        <!-- 切麵:將哪個對象中的哪個方法,織入到哪個切入點 -->

        <aop:aspect id="dd" ref="logService"> 

            <!-- 前置通知 --> 

            <aop:before method="beforeLog" pointcut-ref="myPointcut" /> 

            <aop:after method="Log" pointcut-ref="myPointcut"/> 

            <aop:after-returning method="afterLog" returning="returnObj" pointcut-ref="myPointcut" /> 

        </aop:aspect> 

    </aop:config> 

</beans> 
applicationContext.xml

Step4 測試方法

package com.aaron.log;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**

* @Author Aaron

* @Date 創建時間:2016-1-13

* @Version 1.0

*

* @Project_Package_Description SpringQuartzDemo || com.aaron.log

* @Function_Description 測試

*

*/

public class TestMain {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:config/spring/applicationContext.xml");
        ILoginService loginService = (ILoginService) ctx.getBean("loginService");
        loginService.login("aaron", "123456");
    }
}

Step5 運行,看後臺

 

PS:使用註解可以參考別人寫的這篇博客 http://blog.csdn.net/oathevil/article/details/7288867

 


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

-Advertisement-
Play Games
更多相關文章
  • jquery操作覆選框(checkbox)的12個小技巧。1、獲取單個checkbox選中項(三種寫法)$("input:checkbox:checked").val()或者$("input:[type='checkbox']:checked").val();或者$("input:[name='ck...
  • 學習是技術人員成長的基礎,本次分享20本技術方面的書籍,這些書不是每一本都是經典,但是每一本都有其特點。以下20本大部分本人看過,因此推薦給大家。包含大型網站架構系列, 分散式系統系列,BAT技術文學系列,架構設計系列。
  • GitHub日報:每天新開源的優秀項目;天碼營:部分精彩的博客和實用的經驗;張開濤springMVC博客
  • 1.C++里大寫TRUE和小寫true區別true是bool型的;TRUE是int型的,VC里這個是ms自己定義的;C++規定不允許只通過返回類型不同區別兩個函數2.MFC中的”false“和 “FALSE"有沒區別?有區別。false是bool類型的值,一個位元組大小。而FALSE是BOOL類型的值...
  • 打開文件的步驟如下:彈出打開文件對話框 -> 獲取選擇的文件,並將文件顯示在視圖中。我們程式中經常需要定製的操作如下:1. 定製彈出的文件對話框,例如需要修改打開文件的類型或擴展名2. 定製文件顯示的行為3. 定製文件打開後的行為1. CWinApp::OnFileOpen它是ID_FILE_OPE...
  • 1、簡介 Ruby是日本的Yukihiro Matsumoto寫的,簡單易學的面向對象的腳本語言,像perl一樣,有豐富的文字處理、系統管理等豐富 功能,但是ruby要簡單,容易理解和擴充。跟python很類似,但是在國內遠沒有python有名。Ruby是一種功能強大的面向對象的腳本語言,可以使用它...
  • Day2010 創建java文件列表11 Properties簡述12 Properties存取13 Properties存取配置文件14 Properties練習15 PrintWriter16 合併流17 切割文件10 創建java文件列表練習:將一個指定目錄下的java文件的絕對路徑,存儲到一...
  • 北京尚學堂提供本文並不會對所有命令進行詳細講解,只給出常見用法和解釋。具體用法可以使用--help查看幫助或者直接通過google搜索學習。1.查找文件find / -name filename.txt根據名稱查找/目錄下的filename.txt文件。find . -name "*.xml"遞歸查...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...