1. 程式人生 > >配置了 Spring AOP 但會呼叫兩次的問題解決方法

配置了 Spring AOP 但會呼叫兩次的問題解決方法

1 發現問題

專案配置了 Spring AOP,但會被呼叫兩次:

開始
before()
[2017-07-26 11:10:18.071] [INFO]:[com.deniro.jail.service.sys.SysLogAspect][log] [com.deniro.jail.service.sys.SysLogAspect.log(SysLogAspect.java:43)] [呼叫方法:void com.deniro.jail.service.biz.DictItemService.save(DictItem);輸入引數:[[email protected][dictItemId=<null
>
,dictItemType=health,dictItemDescription=1,dictItemValue=1,dictItemIsOptional=true,createTime=2017-07-26 11:10:18.056,modifyTime=2017-07-26 11:10:18.056]]] 開始 before() Hibernate: insert into ... 結束 [2017-07-26 11:10:18.141] [INFO]:[com.deniro.jail.service.sys.SysLogAspect][log] [com.deniro.jail.service.sys.SysLogAspect.log(SysLogAspect.java:58)] [輸出引數:null;耗時:0:00:00.062] 結束

2 分析問題

切面定義如下:

@Component
@Aspect
public class SysLogAspect {

    static Logger logger = LoggerFactory.getLogger(SysLogAspect.class);

    @Pointcut("@annotation(com.deniro.jail.domain.sys.SysLog)")
    private void sysLog() {
    }

    /**
     * 記錄日誌
     *
     * @param pjp
     */
    @Around
("sysLog()") public Object log(ProceedingJoinPoint pjp) { logger.info("呼叫方法:{};輸入引數:{}", pjp.getSignature() , pjp .getArgs()); StopWatch sw = new StopWatch(); sw.start(); Object o = null; try { System.out.println("開始"); o = pjp.proceed(); System.out.println("結束"); } catch (Throwable throwable) { logger.error("記錄日誌", throwable); } sw.stop(); logger.info("輸出引數:{};耗時:{}", o, sw.toString()); return o; } }

切點用的是註解配置方式,查了一下,只在一個地方定義了這個註解:

@RequestMapping(value = "/save")
@ResponseBody
@SysLog(description = " 儲存【字典項】")
public AjaxResponse save(DictItem dictItem) {
    try {
        dictitemService.save(dictItem);
        return AjaxResponse.success();
    } catch (Exception e) {
        return AjaxResponse.fail();
    }
}

懷疑是重複定義的問題,我們找找看。

開啟 spring 的 MVC 配置檔案:

<!-- 開啟對 @Aspect 的支援-->
<aop:aspectj-autoproxy/>

這是第一處定義的地方,如果類配置了 @Aspect,那麼這個類會被自動掃描到 spring 框架中。

第二處定義的地方在 spring 框架配置檔案:

<!-- 系統日誌切面-->
<bean class="com.deniro.jail.service.sys.SysLogAspect"/>

難怪被執行了兩次呢O(∩_∩)O~

3 解決問題

刪除 spring 框架配置檔案中定義的切面 bean,好了,現在一切恢復正常咯O(∩_∩)O~

記住:開啟了 @Aspect 配置,而且切面類加了 @Aspect 註解,這時就不需要再對切面類進行配置 XML 配置哦。

相關推薦

配置 Spring AOP 呼叫的問題解決方法

1 發現問題 專案配置了 Spring AOP,但會被呼叫兩次: 開始 before() [2017-07-26 11:10:18.071] [INFO]:[com.deniro.jail.service.sys.SysLogAspect][log] [

springboot 打war包去掉專案字首 啟動解決

springboot專案打成war包 去掉字首放置在tomcat  webapps下面,啟動的時候會載入兩次,可以通過修改tomcat的預設啟動路徑 1. tomcat 去掉字首 的方法    server.xml裡面host節點增加 藍色部分   <Host n

中文亂碼在java中URLEncoder.encode方法呼叫解決 (原理)

一、場景: 1、我在客戶端要通過get方式呼叫伺服器端的url,將中文引數做utf-8編碼,需要在js中兩次的進行編碼,伺服器端才能用decode方法一次獲取。 例如: var xing=encodeURIComponent(encodeURIComponent(xing));   2、如果我

中文亂碼在java中URLEncoder.encode方法呼叫解決

System.out.println(java.net.URLDecoder.decode(name, "UTF-8")); 則結果是列印“測試”。 這就印證了 之前為什麼我在servlet中呼叫java.net.URLDecoder.decode(request.getParameter("name

####jquery click點選一執行解決方法【遇到】【解決(先接觸繫結,再繫結):$('#addImg').unbind('click').click(function () {})】

====專案例項: <%--$("body").on("click", "#toggle-button${activityDTO.id}", function (e) {--%> // 一次點選兩次觸發事件 <%--$("body").on("click", "#switc

Spring AOP的實現:Spring AOP攔截器呼叫的實現

上次我說到關於ProxyFactoryBean物件的getObject方法返回了一個代理物件。剩下的AOP實現過程就和jdk的代理模式相同。通過呼叫這個代理物件的方法(這個方法和目標物件是相同的),但是實際上是呼叫了invoke方法,通過反射來實現方法的增強。 關於jdk如何實現代理模式的反

為什麼fork呼叫返回

    fork大家可能都比較熟悉,呼叫一次返回2次,返回pid>0為父程序,pid=0為子程序。一直對fork方法如何返回兩次有些疑惑,函式呼叫一次通常只返回一個結果,fork呼叫怎麼會返回2次?之前查過原因,時間久了有些忘了,今天上網又查了下,其實大家說

Spring AOP 代理實現的種方式: JDK動態代理 和 Cglib框架動態代理

1.JDK動態代理 JDK API 內建 ---- 通過 Proxy類,為目標物件建立代理 (必須面向介面代理 ),此文中介面為UserDao,實現類為UserDaoImpl. public class UserDaoImpl implements UserDao {

Spring Aop巢狀呼叫時沒有生效

轉載自:https://blog.csdn.net/hong10086/article/details/78424481   Spring AOP在同一個類裡自身方法相互呼叫時是無法攔截的。比如在一個 Service 類的 doSomething1() 方法中通過doSomething2

對於配置Spring編碼過濾器之後,仍出現中文亂碼的處理

自從Tomcat5.x開始,就對GET方式和POST方式的提交分別給予不同的處理方式。POST方式是利用request.setCharacterEncoding()來進行設定編碼,如果沒有設定的話,就

配置監聽--當該類實現ServletContextListener,導致spring的@resource不能用,解決方法

這個時候需要我們 以靜態變數儲存Spring ApplicationContext, 可在任何程式碼任何地方任何時候中取出ApplicaitonContext. 新增該類:程式碼如下 package com.beauty.common; import or

spring aop類內部呼叫不攔截原因及解決方案

       spring對應java web開發的同學來說,都不陌生,其中事務@Transactional在service層更是常常使用。 1.aop類內部呼叫不攔截原因 細心的同學也許早就發現當service中的某個沒標註@Transactional的方法呼叫另一個標註

專案中引入 Spring AOP 不生效的解決方法

1 發現問題 打算使用 Spring AOP 做切面實現記錄日誌的功能。因為註解方式比較簡單,所以採用註解來實現。 1、在 spring 的配置檔案中加入了以下配置: <!-- 掃描包下所有的類,讓標註Spring 註解的類生效 --> &

Spring AOP中自我呼叫的問題

前幾天在做專案的時候同事說,在使用AOP進行攔截的時候發現有些方法有時候能輸出攔截的日誌有時候不輸出攔截的日誌。發現在單獨呼叫這些方法的時候是有日誌輸出,在被同一個類中的方法呼叫的時候沒有日誌輸出。我記得之前看過一篇文章是講Spring事務自我呼叫不起作用的問題,應該是同樣的

Spring ApplicationListener使用方法及問題(onApplicationEvent被呼叫)

開發十年,就只剩下這套架構體系了! >>>   

Mysql資料庫亂碼問題(資料庫連結、資料庫格式、資料表列的字符集都是UTF8,還是報錯的解決方法

在做專案的時候遇到一個問題。插入資料的時候中文出現亂碼問題。檢視程式碼中與資料庫的連結,已經設定了UTF-8的編碼,檢視資料庫,資料庫格式也是UTF-8格式,檢視資料表的列,屬性也是UTF-8,檢視程式碼的編碼格式也是UTF-8,但是在插入資料的時候中文還是會出現亂碼問題。 最

解決Extjs一雙擊觸發單擊事件,和一雙擊事件

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興! 給我老師的人工智慧教程打call!http://blog.csdn.net/ji

moquette改造筆記(四):解決InterceptHandler中的onConnectionLost()呼叫

發現問題 在使用中裝置異常斷開,InterceptHandler中的onConnectionLost()。經過除錯發現是MoquetteIdleTimeoutHandler中的程式碼導致的,程式碼如下: @Override public void userE

spring註解定時器啟動解決方案

<?xml version="1.0" encoding="utf-8" ?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/

異常:通過Spring aop 記錄日誌重複多記錄問題

異常現象 最近發現新上線的一個專案中日誌記錄有問題,正常每次呼叫應該只記錄一次日誌的,在日誌記錄表內發現有許多請求都有十來條記錄,並且記錄的更新時間距離寫入時間有十來分鐘的,也有超過一天的。 異常分析       分析原始碼發現,整個記錄日誌的模組通過Spring ao