Spring AOP表达式

时间:2012-02-25 00:32:27

标签: spring aop

我在webapp启动时收到此错误

引起:org.springframework.beans.factory.BeanCreationException:创建名为'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0'的bean时出错:bean的实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.aop.aspectj.AspectJPointcutAdvisor]:构造函数抛出异常;嵌套异常是java.lang.IllegalArgumentException:错误在:: 0正式未绑定的切入点

这是xml的一部分,在底部显示我的切入点

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

.....省略的事情

  <aop:config>
    <aop:aspect id="bamAspectAroundID" ref="bamAspectAround">
        <aop:pointcut id="bamAroundMethodPointcut" expression="execution(* testBA*(..))" />
        <aop:around method="aspectAroundMethod" pointcut-ref="bamAroundMethodPointcut"/>
    </aop:aspect>
  </aop:config>

在我的一个课程中,我有一个虚拟方法

    public void testBAM() {
       System.out.println("in testBAM() ");
    }

表达似乎对我好。任何指针?我们正在使用aspectj 1.6.2。感谢。

1 个答案:

答案 0 :(得分:0)

我可以确认您的AspectJ表达式没问题。我使用你在上面提供的内容做了一个测试版本并且它有效。

我没有在Web容器中这样做 - 我使用AspectJ工具1.6.6和AspectJ weaver 1.6.8和Spring 3.1库在Eclipse中作为独立的Spring应用程序执行它,所以稍微超出了您的设置版本

这就是我的工作:

我的类路径中与方面相关的jar文件是:

  • org.springframework.aop-3.1.0
  • org.springframework.aspects-3.1.0
  • com.springsource.org.aspectj.tools-1.6.6
  • com.springsource.org.aspectj.weaver-1.6.8
  • com.springsource.org.aopalliance-1.0.0

我的xml配置的AOP部分看起来与你的完全一样 - 没有变化。

我将以下bean定义添加到相同的spring xml配置文件中:

<bean id="aspectTarget"    class="foo.bam.Target" />
<bean id="bamAspectAround" class="foo.bam.BamAspectAround" />

Target类具有testBAM()方法。

BamAspectAround的代码如下所示:

public class BamAspectAround {
  public void aspectAroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println(">>> BamAspectAround Before");
    joinPoint.proceed();
    System.out.println("<<< BamAspectAround After");
  }
}

主要方法有:

Target t = (Target)ctx.getBean("aspectTarget");
t.testBAM();

它打印出我的预期:

>>> BamAspectAround Before
in testBAM() 
<<< BamAspectAround After

注意:我还下载了AspectJ 1.6.2并将其weaver jar及其工具jar放入我的classpath(删除了1.6.8)并且上面也有效,所以也许试试这个简单您的设置示例,并查看您在Web部署版本中缺少的内容。