1. 程式人生 > >aop:aspectj-autoproxy 致使autowired失效

aop:aspectj-autoproxy 致使autowired失效

對Struts1/2 Action應用Spring AOP問題小結
       之前使用SSH三大經典框架的時候,寫了一個簡單的統計Action每個方法執行時間的功能類,程式碼如下:
  1. import javax.servlet.http.HttpServletRequest;  
  2. import org.aopalliance.intercept.MethodInterceptor;  
  3. import org.aopalliance.intercept.MethodInvocation;  
  4. import org.apache.commons.lang.StringUtils;  
  5. import org.apache.commons.lang.time.StopWatch;  
  6. import org.apache.struts.actions.DispatchAction;  
  7. import org.slf4j.Logger;  
  8. import org.slf4j.LoggerFactory;  
  9. import org.springframework.stereotype.Service;  
  10. import org.springframework.aop.framework.ReflectiveMethodInvocation;  
  11. /** 
  12.  * 統計方法執行時間的攔截器,採用Spring AOP方式實現.
     
  13.  *  
  14.  * @author Kanine 
  15.  */
  16. @Service("runTimeHandler")  
  17. publicclass RunTimeHandler implements MethodInterceptor {  
  18.     privatestatic Logger logger = LoggerFactory.getLogger("code.coolbaby");  
  19.     @SuppressWarnings("unchecked")  
  20.     public Object invoke(MethodInvocation methodInvocation) 
    throws Throwable {  
  21.         Object[] args = methodInvocation.getArguments();  
  22.         String method = methodInvocation.getMethod().getName();  
  23.         String action = methodInvocation.getMethod().getDeclaringClass().getName();  
  24.         /** 
  25.          * 由於Spring使用了Cglib代理,導致不能直接取得目標類名,需作此轉換 
  26.          */
  27.         if (methodInvocation instanceof ReflectiveMethodInvocation) {  
  28.             Object proxy = ((ReflectiveMethodInvocation) methodInvocation).getProxy();  
  29.             action = StringUtils.substringBefore(proxy.toString(), "@");  
  30.             /** 
  31.              * 如使用了DispatchAction,將不能直接取得目標方法,需作此處理 
  32.              */
  33.             if (proxy instanceof DispatchAction) {  
  34.                 for (Object arg : args) {  
  35.                     if (arg instanceof HttpServletRequest)  
  36.                         method = ((HttpServletRequest) arg).getParameter("method");  
  37.                 }  
  38.             }  
  39.         }  
  40.         /** 
  41.          * 方法引數型別,轉換成簡單型別  
  42.          */
  43.         Class[] params = methodInvocation.getMethod().getParameterTypes();  
  44.         String[] simpleParams = new String[params.length];  
  45.         for (int i = 0; i < params.length; i++) {  
  46.             simpleParams[i] = params[i].getSimpleName();  
  47.         }  
  48.         String simpleMethod = method + "(" + StringUtils.join(simpleParams, ",") + ")";  
  49.         logger.info("{} 開始執行[{}]方法", action, method);  
  50.         StopWatch clock = new StopWatch();  
  51.         clock.start();  
  52.         Object result = methodInvocation.proceed();  
  53.         clock.stop();  
  54.         logger.info("執行[{}]方法共消耗{}毫秒", simpleMethod, clock.getTime());  
  55.         return result;  
  56.     }  
  57. }  
在applicationcontext.xml加入以下配置:
  1. <context:component-scanbase-package="code.coolbaby"/>
  2. <aop:config>
  3.     <aop:advisoradvice-ref="runTimeHandler"pointcut="execution(* code.coolbaby.core.BaseDispatchAction.*(..))"/>
  4. </aop:config>
就可以正確地以AOP的方式完成原本比較繁瑣的功能了。
最近把框架升級到SS2H,順便把Spring AOP實現由原來的Schema方式改為AspectJ方式,程式碼如下:
  1. import org.apache.commons.lang.time.StopWatch;  
  2. import org.aspectj.lang.ProceedingJoinPoint;  
  3. import org.aspectj.lang.annotation.Around;  
  4. import org.aspectj.lang.annotation.Aspect;  
  5. import org.aspectj.lang.annotation.Pointcut;  
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8. import org.springframework.stereotype.Component;  
  9. /** 
  10.  * 統計方法執行時間的工具類,採用Spring AOP方式實現. 
  11.  *  
  12.  * @author Kanine 
  13.  */
  14. @Aspect
  15. @Component
  16. publicclass RunTimeHandler {  
  17.     privatestatic Logger logger = LoggerFactory.getLogger("code.coolbaby");  
  18.     @Pointcut("execution(public String *()) && !execution(public String toString())" + " && target(code.coolbaby.core.CRUDActionSupport)")  
  19.     void timer() {  
  20.     }  
  21.     @Around("timer()")  
  22.     public Object time(ProceedingJoinPoint joinPoint) throws Throwable {  
  23.         String clazz = joinPoint.getTarget().getClass().getSimpleName();  
  24.         String method = joinPoint.getSignature().getName();  
  25.         StopWatch clock = new StopWatch();  
  26.         clock.start();  
  27.         Object result = joinPoint.proceed();  
  28.         clock.stop();  
  29.         String[] params = new String[] { clazz, method, clock.getTime() + "" };  
  30.         logger.info("[{}]執行[{}]方法共消耗[{}]毫秒", params);  
  31.         return result;  
  32.     }  
  33. }  
struts.xml內容如下:
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"  
  3.         "http://struts.apache.org/dtds/struts-2.1.dtd">
  4. <struts>
  5.     <constantname="struts.convention.default.parent.package"value=

    相關推薦

    aop:aspectj-autoproxy 致使autowired失效

    對Struts1/2 Action應用Spring AOP問題小結        之前使用SSH三大經典框架的時候,寫了一個簡單的統計Action每個方法執行時間的功能類,程式碼如下: import javax.servlet.http.HttpSer

    aop aspectj autoproxy / 的作用

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

    spring基於aspectjAOP配置 aop:aspectj-autoproxy proxy-target-class="true"

    精通Spring4.x--企業應用開發實戰 [email protected]("@annotation()")切點函式詳解 程式碼實現的目標是為NaugthyWaiter類的greetTo()方法實現後置增強,其中greetTo()方法被@NeedTest

    aop:aspectj-autoproxy 標籤解析

    1.標籤解析對應的handler http\://www.springframework.org/schema/aop=org.springframework.aop.config.AopNames

    aop:aspectj-autoproxy 不能生效

    警告: Exception encountered during context initialization - cancelling refresh attemptorg.springframework.beans.factory.BeanCreationException: Error creating

    萬用字元的匹配很全面, 但無法找到元素 'aop:aspectj-autoproxy' 的宣告

    因為專案需要,想使用spring的註解方法的AOP切面程式設計,在xml配置檔案中加入<aop:aspectj-autoproxy proxy-target-class="true"/> 之後,專案啟動報文章標題的錯誤。 檢查原因是忘記引用AOP的檔案。 xm

    Spring 之AOP AspectJ切入點語法詳解(最全面、最詳細。)(轉)

    6.5  AspectJ切入點語法詳解 6.5.1  Spring AOP支援的AspectJ切入點指示符        切入點指示符用來指示切入點表示式目的,,在spring AOP中目

    29--aspectj-autoproxy解析及Spring解析自定義標籤

    前兩個小節已經介紹了AOP的一些基礎知識回顧並對靜態代理、JDK動態代理、CGLIB動態代理做了一些簡單的介紹,本節介紹AOP標籤的解析過程。 1.aspectj-autoproxy標籤簡介 使用註解方式應用aop需要在配置檔案中配置<aop:aspect

    Spring 之AOP AspectJ切入點語法詳解 @AspectJ進階

    AspectJ切入點語法詳解 此文章來源於網路,版權不歸本人所有。本人結合起來 1.Spring AOP @Before @Around @After 等 advice 的執行順序    @Around/**ProceedingJo

    32--aspectj-autoproxy解析及Spring解析自定義標籤

    前面的章節已經介紹了AOP的相關概念和一些知識點,接下來我們就要開始分析SpringAOP的原始碼了,接下來的分析都基於@AspectJ註解。雖然@AspectJ是基於註解的方式實現AOP,但還是要在配置檔案中配置<aop:aspectj-autoprox

    Spring aop AspectJ切入點初用心得

    以前專案中未用過aop,故一直對aop不瞭解,近期看了看,大致瞭解了下,在上程式碼前首先需要了解aop一些基本概念。 一、AOP基本概念 : 1、Aspect(切面):說白了就是一個class,裡面定義切入點和通知 2、JointPoint(連線點):接入

    Spring框架的AOPAspectJ支援包下載的與安裝

           學習Spring框架進行面向方面的程式設計(AOP)時,所需要的AspectJ支援包來源於Eclipse下面的一個子專案AspectJ,可到此專案的官網地址下載AspectJ支援包。同時也要下載aopalliance包並新增到專案中。 一

    Spring 之AOP AspectJ切入點語法詳解(最全了,不需要再去其他地找了)

    6.5  AspectJ切入點語法詳解 6.5.1  Spring AOP支援的AspectJ切入點指示符        切入點指示符用來指示切入點表示式目的,,在Spring AOP中目前只有執行方法這一個連線點,Spring AOP支援的AspectJ切入點指示符

    org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator

    Spring提供了很多擴充套件介面,BeanPostProcessor介面和InstantiationAwareBeanPostProcessor介面就是其中兩個。 BeanPostProcessor BeanPostProcessor介面作用是:如果我們需要在Spring容器完成Bean的例項化、配置和

    關於 spring aop (aspectj) 你該知曉的一切

    本篇是年後第一篇博文,由於博主用了不少時間在構思這篇博文,加上最近比較忙,所以這篇檔案寫得比較久,也分了不同的時間段在寫,已盡最大能力去連貫博文中的內容,盡力呈現出簡單易懂的文字含義,如文中有錯誤請留言,謝謝。 神一樣的AspectJ-AOP的領跑者AspectJ的織入方式及其原理概要

    Spring-AOP @AspectJ進階之繫結類註解物件

    概述 例項 概述 @within()和@target()函式可以將目標類的註解物件繫結到增強方法中。 我們通過@within()演示註解繫結的操作 例項 註

    Spring AOP+AspectJ在XML配置例項(詳解)

    在本教程中,我們將向你展示如何轉換上章節中 轉成基於XML的配置。對於那些不喜歡註釋,使用JDK1.4,則可以基於XML,而不使用 AspectJ。再次回顧上個 customerBo 介面中的幾個方法,以後你將學會如何在 XML檔案實現 AspectJ 攔截。File:Cus

    Spring AOP @AspectJ 入門例項

    從Spring 2.0開始,可以使用基於schema及@AspectJ的方式來實現AOP,本文以一個簡單的例項介紹瞭如何以@AspectJ方式在Spring中實現AOP。由於@Aspect是基於註解的,因此要求支援註解的5.0版本以上的JDK。  環境要求:     1

    Spring-AOP @AspectJ進階之繫結丟擲的異常

    概述 例項 總結 概述 和通過切點函式繫結連線點資訊不同,連線點丟擲的異常必須使用AfterThrowing註解的throwing成員進行繫結 例項 業務類 p

    配置@aspectj-autoproxy切面,生成代理物件

    有時候在呼叫一個方法時,可能需要在呼叫該方法之前需要做點其他的操作,比如我要做一個往資料庫中插入資料的操作,這個插入的方法有一個json資料,但是我可能在插入之前還需要往這個json引數中塞入其他的資