首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用@ AOP java.lang.StackOverflowError的AOP弹簧

使用@ AOP java.lang.StackOverflowError的AOP弹簧
EN

Stack Overflow用户
提问于 2016-11-04 13:21:57
回答 1查看 521关注 0票数 1

我正在努力学习AOP春天。因此,我已经在露娜eclipse中安装了AspectJ插件并创建了AspectJ项目,下面是项目探索的快照:

项目探索1:https://i.stack.imgur.com/el0TZ.jpg

这是我的密码:

AopMain.java

代码语言:javascript
运行
复制
 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

代码语言:javascript
运行
复制
 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

代码语言:javascript
运行
复制
  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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
 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

代码语言:javascript
运行
复制
<?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中使用。

代码语言:javascript
运行
复制
@Before("args(name)")
    public void stringArgumentMethods(String name){
         System.out.println("name: "+name);
  }

但是,当我添加它时,我将得到java.lang.stackOverflowError:

代码语言:javascript
运行
复制
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)

有人能告诉我为什么会发生这种事吗?怎么能解决呢?

EN

回答 1

Stack Overflow用户

发布于 2016-11-04 13:46:10

从java文档,

StackOverFlowError -什么:

由于应用程序递归太深而发生堆栈溢出时引发。

这意味着,内存(堆栈)是完全的,没有空间可以进一步存储。

为什么:

中,大多数情况都是通过方法的调用来创建的。

您的例子中,@Before("args(name)") --这一行试图找到带有参数"name“的ALL方法,发现自己是(导致递归调用),堆栈溢出error.Because stringArgumentMethods(String name)也有参数name

代码语言:javascript
运行
复制
public void stringArgumentMethods(String name){
     System.out.println("name: "+name);

}

如何解决:

要么重写AspectJ表达式- @Before("args(name)")

将参数重命名为stringArgumentMethods(String name123)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40423768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档