2016-11-04 89 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

不,不幸的是,仍然是相同的错误! –