簡體   English   中英

Spring AOP方面沒有執行

[英]Spring AOP aspect around not executing

我現在想要算一下我的方法。 所以我使用Around方面,但它不起作用。 既沒有注釋也沒有XML。 Dubgger表明Aspect尚未被調用。 不幸的是,沒有例子有幫助。

TimeCountAspect.java

@Aspect
@Component
public class TimeCountAspect {

     @Around("execution(* com.springapp.Calculation.Calculator.calculate(..))")
     public Object timeCounterClass(ProceedingJoinPoint joinpoint) {
         Object result = null;
         try {
            System.out.println("Preparing to calculate");
            long start = System.currentTimeMillis(); // Before

             result = joinpoint.proceed(); // Method invoke

             long end = System.currentTimeMillis(); // After
             System.out.println("Calculation took " + (end - start)
                     + " milliseconds.");
         } catch (Throwable t) {
             System.out.println("Nothing happend!");
         }
         return result;
     }
 }

它完美地看到了所有類,並且它們與XML中的bean聲明相關聯。 (IntelliJ Idea顯示它)。 XML片段

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

 <mvc:annotation-driven/>
 <mvc:resources mapping="/resources/**" location="/"/>


<!-- Enable AspectJ style of Spring AOP -->
<aop:aspectj-autoproxy/>

<aop:aspectj-autoproxy proxy-target-class="true">
    <aop:include name="timeCounterAspect" />
</aop:aspectj-autoproxy>


<bean id="timeCounterAspect" class="com.springapp.Calculation.TimeCountAspect"/>

<aop:config>
    <aop:aspect id="timeCount" ref="timeCounterAspect">
        <aop:pointcut id="calculation" expression=
                "execution(* com.springapp.Calculation.Calculator.calculate(..))"/>
        <aop:around
                pointcut-ref="calculation"
                method="timeCounterClass"/>
    </aop:aspect>
</aop:config>

................factories and other things............

</beans>

POM.XML片段

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>${aspect.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>${aspect.version}</version>
</dependency>

我想要應用於哪個方面的calculate()方法 有調用方法calculate()的方法call ()

  public BigDecimal calculate(int numberOfThreads, int precision) {
      ................
     return summ;
  }


 public BigDecimal call() throws Exception {
        return calculate(Calculator.numberOfThreads, Calculator.precision);
    }

您正在使用Spring AOP ,它在代理模型中工作。 這意味着它會在實際的bean上創建一個包裝代理。 這種設置的眾所周知的局限性是:

  • 僅攔截來自外部調用的方法執行
  • 不知道本地電話(或使用thissuper電話)
  • 僅對public成員進行攔截( private / protected不能被截獲)
  • 不可能將方面本身作為其他方面的建議目標。 類上的@Aspect注釋將其標記為方面,因此將其從自動代理中排除。

您試圖攔截bean本身內的本地調用,這是使用此設置無法實現的。

要克服上述限制,您需要設置基於AspectJ的原生編織環境

參考文獻: Spring-Framework-Reference

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM