最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring AOP使用@Aspect注解 面向切面實(shí)現(xiàn)日志橫切的操作

 更新時(shí)間:2021年06月22日 08:40:28   作者:zsq_fengchen  
這篇文章主要介紹了Spring AOP使用@Aspect注解 面向切面實(shí)現(xiàn)日志橫切的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

引言:

AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù).AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。

利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。

在Spring AOP中業(yè)務(wù)邏輯僅僅只關(guān)注業(yè)務(wù)本身,將日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等代碼從業(yè)務(wù)邏輯代碼中劃分出來,通過對(duì)這些行為的分離,我們希望可以將它們獨(dú)立到非指導(dǎo)業(yè)務(wù)邏輯的方法中,進(jìn)而改變這些行為的時(shí)候不影響業(yè)務(wù)邏輯的代碼。

相關(guān)注解介紹如下:

@Aspect:作用是把當(dāng)前類標(biāo)識(shí)為一個(gè)切面供容器讀取

@Pointcut:Pointcut是植入Advice的觸發(fā)條件。每個(gè)Pointcut的定義包括2部分,一是表達(dá)式,二是方法簽名。方法簽名必須是 public及void型??梢詫ointcut中的方法看作是一個(gè)被Advice引用的助記符,因?yàn)楸磉_(dá)式不直觀,因此我們可以通過方法簽名的方式為 此表達(dá)式命名。因此Pointcut中的方法只需要方法簽名,而不需要在方法體內(nèi)編寫實(shí)際代碼。

@Around:環(huán)繞增強(qiáng),相當(dāng)于MethodInterceptor

@AfterReturning:后置增強(qiáng),相當(dāng)于AfterReturningAdvice,方法正常退出時(shí)執(zhí)行

@Before:標(biāo)識(shí)一個(gè)前置增強(qiáng)方法,相當(dāng)于BeforeAdvice的功能,相似功能的還有

@AfterThrowing:異常拋出增強(qiáng),相當(dāng)于ThrowsAdvice

一:引入相關(guān)依賴

二:Spring的配置文件

applicationContext.xml 中引入context、aop對(duì)應(yīng)的命名空間;配置自動(dòng)掃描的包,同時(shí)使切面類中相關(guān)方法中的注解生效,需自動(dòng)地為匹配到的方法所在的類生成代理對(duì)象。

創(chuàng)建簡單計(jì)算器的接口ArithmeticCalculator.java及實(shí)現(xiàn)類ArithmeticCalculatorImpl.java

package com.svse.aop;
public interface ArithmeticCalculator {
    //定義四個(gè)簡單的借口 加減乘除算法
    int add(int i, int j);
    int sub(int i, int j);
    int mul(int i, int j);
    int div(int i, int j);
}
package com.svse.aop;
import org.springframework.stereotype.Component;
//將實(shí)現(xiàn)類加入Spring的IOC容器進(jìn)行管理
@Component("arithmeticCalculator")
public class ArithmeticCalculatorImpl implements ArithmeticCalculator {
    @Override
    public int add(int i, int j) {
         int result = i + j;
            return result;
    }
    @Override
    public int sub(int i, int j) {
          int result = i - j;
            return result;
    }
    @Override
    public int mul(int i, int j) {
          int result = i * j;
            return result;
    }
    @Override
    public int div(int i, int j) {
          int result = i / j;
            return result;
    }
}

現(xiàn)在想在實(shí)現(xiàn)類中的每個(gè)方法執(zhí)行前、后、以及是否發(fā)生異常等信息打印出來,需要把日志信息抽取出來,寫到對(duì)應(yīng)的切面的類中 LoggingAspect.java 中 要想把一個(gè)類變成切面類,需要兩步,

① 在類上使用 @Component 注解 把切面類加入到IOC容器中

② 在類上使用 @Aspect 注解 使之成為切面類

package com.svse.aop;
import java.util.Arrays;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import com.tencentcloudapi.vod.v20180717.VodClient;
/**
 * 日志切面
 * 
 * @author zhaoshuiqing<br>
 * @date 2019年6月14日 下午3:03:29
 */
@Component
@Aspect
public class LoggingAspect {
    //現(xiàn)在想在實(shí)現(xiàn)類中的每個(gè)方法執(zhí)行前、后、以及是否發(fā)生異常等信息打印出來,需要把日志信息抽取出來,寫到對(duì)應(yīng)的切面的類中 LoggingAspect.java 中 
    //要想把一個(gè)類變成切面類,需要兩步, 
    //① 在類上使用 @Component 注解 把切面類加入到IOC容器中 
    //② 在類上使用 @Aspect 注解 使之成為切面類    
    
    /**
     * 前置通知:目標(biāo)方法執(zhí)行之前執(zhí)行以下方法體的內(nèi)容 
     * @param jp
     */
    @Before("execution(* com.svse.aop.*.*(..))")
    public void beforeMethod(JoinPoint jp){
         String methodName =jp.getSignature().getName();
         System.out.println("【前置通知】the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
    }
    
     /**
     * 返回通知:目標(biāo)方法正常執(zhí)行完畢時(shí)執(zhí)行以下代碼
     * @param jp
     * @param result
     */
    @AfterReturning(value="execution(* com.svse.aop.*.*(..))",returning="result")
    public void afterReturningMethod(JoinPoint jp, Object result){
         String methodName =jp.getSignature().getName();
         System.out.println("【返回通知】the method 【" + methodName + "】 ends with 【" + result + "】");
    }    
      /**
     * 后置通知:目標(biāo)方法執(zhí)行之后執(zhí)行以下方法體的內(nèi)容,不管是否發(fā)生異常。
     * @param jp
     */
    @After("execution(* com.svse.aop.*.*(..))")
    public void afterMethod(JoinPoint jp){
        System.out.println("【后置通知】this is a afterMethod advice...");
    }    
    
    /**
     * 異常通知:目標(biāo)方法發(fā)生異常的時(shí)候執(zhí)行以下代碼
     */
    @AfterThrowing(value="execution(* com.qcc.beans.aop.*.*(..))",throwing="e")
    public void afterThorwingMethod(JoinPoint jp, NullPointerException e){
         String methodName = jp.getSignature().getName();
         System.out.println("【異常通知】the method 【" + methodName + "】 occurs exception: " + e);
    }    
    
  /**
  * 環(huán)繞通知:目標(biāo)方法執(zhí)行前后分別執(zhí)行一些代碼,發(fā)生異常的時(shí)候執(zhí)行另外一些代碼
  * @return 
  */
 /*@Around(value="execution(* com.svse.aop.*.*(..))")
 public Object aroundMethod(ProceedingJoinPoint jp){
     String methodName = jp.getSignature().getName();
     Object result = null;
     try {
         System.out.println("【環(huán)繞通知中的--->前置通知】:the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
         //執(zhí)行目標(biāo)方法
         result = jp.proceed();
         System.out.println("【環(huán)繞通知中的--->返回通知】:the method 【" + methodName + "】 ends with " + result);
     } catch (Throwable e) {
         System.out.println("【環(huán)繞通知中的--->異常通知】:the method 【" + methodName + "】 occurs exception " + e);
     }
     
     System.out.println("【環(huán)繞通知中的--->后置通知】:-----------------end.----------------------");
     return result;
 }*/
}

編寫MainTest方法進(jìn)行測試

package com.svse.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
    public static void main(String[] args) {
        
        //ClassPathXmlApplicationContext默認(rèn)是加載src目錄下的xml文件
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); 
        ArithmeticCalculator arithmeticCalculator =(ArithmeticCalculator) ctx.getBean("arithmeticCalculator");
        
        System.out.println(arithmeticCalculator.getClass());
        int result = arithmeticCalculator.add(3, 5);
        System.out.println("result: " + result);
        
        result = arithmeticCalculator.div(5, 0);
        System.out.println("result: " + result);
    }
}

運(yùn)行結(jié)果:

把其它代碼都注釋掉,把環(huán)繞通知的方法釋放出來,測試結(jié)果如下:

至此AOP注解面向切面記錄日志就寫完了!

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis中的延遲加載詳細(xì)解讀

    Mybatis中的延遲加載詳細(xì)解讀

    這篇文章主要介紹了Mybatis中的延遲加載詳細(xì)解讀,Mybatis中延遲加載又稱為懶加載,是指在進(jìn)行關(guān)聯(lián)查詢時(shí),按照設(shè)置延遲規(guī)則推遲對(duì)關(guān)聯(lián)對(duì)象的select查詢,延遲加載可以有效的減少數(shù)據(jù)庫的壓力,需要的朋友可以參考下
    2023-10-10
  • SpringBoot是如何使用SQL數(shù)據(jù)庫的?

    SpringBoot是如何使用SQL數(shù)據(jù)庫的?

    今天給大家?guī)淼氖顷P(guān)于Springboot的相關(guān)知識(shí),文章圍繞著SpringBoot是如何使用SQL數(shù)據(jù)庫的展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java序列化的原理分析及解決

    Java序列化的原理分析及解決

    文章介紹了Java中的序列化機(jī)制,包括Serializable和Externalizable接口的區(qū)別,以及serialVersionUID的作用,Serializable接口可以序列化的所有子類型本身都是可序列化的,如果要序列化的類有父類,父類也應(yīng)該實(shí)現(xiàn)Serializable接口
    2024-11-11
  • java開發(fā)微信分享接口的步驟

    java開發(fā)微信分享接口的步驟

    這篇文章主要為大家詳細(xì)介紹了java開發(fā)微信分享接口的步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Mybatis-plus如何通過反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能

    Mybatis-plus如何通過反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能

    這篇文章主要介紹了Mybatis-plus如何通過反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • SpringBoot如何使用MyBatisPlus逆向工程自動(dòng)生成代碼

    SpringBoot如何使用MyBatisPlus逆向工程自動(dòng)生成代碼

    本文介紹如何使用SpringBoot、MyBatis-Plus進(jìn)行逆向工程自動(dòng)生成代碼,并結(jié)合Swagger3.0實(shí)現(xiàn)API文檔的自動(dòng)生成和訪問,通過詳細(xì)步驟和配置,確保Swagger與SpringBoot版本兼容,并通過配置文件和測試類實(shí)現(xiàn)代碼生成和Swagger文檔的訪問
    2024-12-12
  • AJAX中Get請(qǐng)求報(bào)錯(cuò)404的原因以及解決辦法

    AJAX中Get請(qǐng)求報(bào)錯(cuò)404的原因以及解決辦法

    剛學(xué)習(xí)一門技術(shù)時(shí)總會(huì)踩一些坑,下面這篇文章主要給大家介紹了關(guān)于AJAX中Get請(qǐng)求報(bào)錯(cuò)404的原因及解決辦法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Java操作數(shù)據(jù)庫(行級(jí)鎖,for update)

    Java操作數(shù)據(jù)庫(行級(jí)鎖,for update)

    這篇文章主要介紹了Java操作數(shù)據(jù)庫(行級(jí)鎖,for update),文章圍繞Java操作數(shù)據(jù)庫的相關(guān)資料展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2021-12-12
  • SpringBatch結(jié)合SpringBoot簡單使用實(shí)現(xiàn)工資發(fā)放批處理操作方式

    SpringBatch結(jié)合SpringBoot簡單使用實(shí)現(xiàn)工資發(fā)放批處理操作方式

    這篇文章主要介紹了SpringBatch結(jié)合SpringBoot簡單使用實(shí)現(xiàn)工資發(fā)放批處理操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 三道java新手入門面試題,通往自由的道路--JVM

    三道java新手入門面試題,通往自由的道路--JVM

    這篇文章主要為大家分享了最有價(jià)值的3道JVM面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對(duì)hashCode方法的設(shè)計(jì)、垃圾收集的堆和代進(jìn)行剖析,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評(píng)論

伊春市| 阳原县| 鹤峰县| 土默特右旗| 汨罗市| 枣强县| 武夷山市| 宣威市| 泽库县| 克东县| 隆林| 怀仁县| 泰州市| 德兴市| 鱼台县| 独山县| 水城县| 鄂州市| 分宜县| 新沂市| 临潭县| 望谟县| 邛崃市| 成都市| 黑河市| 平罗县| 玉田县| 罗源县| 白沙| 开封县| 江都市| 西乡县| 大邑县| 平谷区| 江川县| 绥滨县| 天等县| 元氏县| 于都县| 南木林县| 灵山县|