2016-11-04 90 views
1

我想學習AOP彈簧。所以我已經安裝了AspectJ的插上和紅月月食創建AspectJ項目,這裏是項目的快照瀏覽:使用@Before的AOP彈簧得到java.lang.StackOverflowError

[項目瀏覽] [1] [1]:https://i.stack.imgur.com/el0TZ.jpg

,這裏是我的代碼:

AopMain.java

package org.koushik.javabrains; 

import org.koushik.javabrains.service.ShapeService; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class AopMain { 

public static void main(String[] args) { 
    ApplicationContext ctx = new 
      ClassPathXmlApplicationContext("spring.xml"); 
    ShapeService shapeService = ctx.getBean("shapeService",ShapeService.class); 
    System.out.println(shapeService.getCircle().getCircleName()); 
    } 

} 

LoggingAspect.java

package org.koushik.javabrains.aspect; 
import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class LoggingAspect { 
    @Before("allCircleMethod()") 
    public void loggingAdvice(JoinPoint joinPoint){ 
    System.out.println(joinPoint.toString()); 
} 
//@Before("args(name)") 
//public void stringArgumentMethods(String name){ 
//  System.out.println("name: "+name); 
//} 


@Pointcut("execution(* get*())") 
public void allGetters(){} 

@Pointcut("within(org.koushik.javabrains.model.Circle)") 
public void allCircleMethod(){} 
} 

Circle.java

package org.koushik.javabrains.model; 

    public class Circle { 

    private String circleName; 

    public String getCircleName() { 
    return circleName; 
    } 

    public void setCircleName(String circleName) { 
    this.circleName = circleName; 
    } 
} 

Triangle.java

package org.koushik.javabrains.model; 

public class Triangle { 
    private String triangleName; 

    public String getTriangleName() { 
     return triangleName; 
    } 

    public void setTriangleName(String triangleName) { 
     this.triangleName = triangleName; 
    } 
} 

ShapeServices.java

package org.koushik.javabrains.service; 

import org.koushik.javabrains.model.Circle; 
import org.koushik.javabrains.model.Triangle; 

public class ShapeService { 
    private Circle circle; 
    private Triangle triangle; 

    public Circle getCircle() { 
     return circle; 
    } 
    public void setCircle(Circle circle) { 
    this.circle = circle; 
    } 
    public Triangle getTriangle() { 
     return triangle; 
    } 
    public void setTriangle(Triangle triangle) { 
    this.triangle = triangle; 
    } 
} 

spring.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy> 

    <bean name="triangle" class="org.koushik.javabrains.model.Triangle"> 
    <property name="name" value ="Triangle name"></property> 
    </bean> 

    <bean name="circle" class="org.koushik.javabrains.model.Circle"> 
     <property name="name" value ="Circle Name"></property> 
    </bean> 
    <bean name="shapeService" class="org.koushik.javabrains.service.ShapeService" autowire="byName"/> 
    <bean name ="loggingAspect" class ="org.koushik.javabrains.aspect.LoggingAspect"/> 

</beans> 

的代碼工作正常,而不使用在LoggingAspect.java

@Before("args(name)") 
    public void stringArgumentMethods(String name){ 
     System.out.println("name: "+name); 
    } 

但是當我添加它,我會得到java.lang.StackOverflowError的:

Exception in thread "main" java.lang.StackOverflowError 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 
    at org.koushik.javabrains.aspect.LoggingAspect.stringArgumentMethods(LoggingAspect.java) 

誰能告訴我爲什麼這個happend?怎麼能解決它?

回答

1

從Java文檔,

的StackOverflowError - 什麼:

Thrown when a stack overflow occurs because an application recurses too deeply.

這意味着,內存(棧)已滿,沒有空間來進一步存儲。

爲什麼:

箱子這種情況可通過遞歸/深調用的方法創建。

你的情況下@Before("args(name)") - 此行試圖尋找ALL方法與參數「名稱」,它發現自己導致遞歸調用,並且還具有參數name的計算器error.Because stringArgumentMethods(String name)

public void stringArgumentMethods(String name){ 
    System.out.println("name: "+name); 

}

如何解決:

要麼重寫你的AspectJ表達 - @Before("args(name)")

或者

重命名參數stringArgumentMethods(String name123)

+0

感謝您的評論,我想第二個選項,但我仍然得到了同樣的StackOverflow錯誤! –

+0

字符串abc(完全不同的名稱) –

+0

不,不幸的是,仍然是相同的錯誤! –