使用SpringAOP-AspectJ的确认消息

使用SpringAOP-AspectJ的确认消息,spring,aop,aspectj,Spring,Aop,Aspectj,我试图学习使用AspectJ实现SpringAOP。 我有5个不同的课程包 package com.sample.a; Class A{ public void save(){ } } } 无论何时调用这些方法,我都需要打印“Hello World”,如何使用Spring AOP(AspectJ)实现上述场景。到目前为止,我已经做了以下工作: 1)在applicationContext.xml中启用了Spring AspectJ支持 <aop:aspect

我试图学习使用AspectJ实现SpringAOP。 我有5个不同的课程包

package com.sample.a;
Class A{
    public void save(){
    }
    }
}




无论何时调用这些方法,我都需要打印“Hello World”,如何使用Spring AOP(AspectJ)实现上述场景。到目前为止,我已经做了以下工作:

1)在applicationContext.xml中启用了Spring AspectJ支持

<aop:aspectj-autoproxy />
<bean id="sampleAspectJ" class="com.sample.xxxxxxxx" />

有没有更好的方法来实现上述场景?如果这5个类位于不同的包中,并且具有不同的方法名,该怎么办?我是否需要在aspect中编写5种不同的方法(用@after advice注释)

您应该熟悉AspectJ切入点语法。比如说

  • 示例中您自己的切入点
    执行(*com.sample.*.Save(..)
    与任何示例
    Save()
    方法都不匹配,因为
    • 您使用大写字母“S”编写了
      Save()
      ,但这些方法的第一个字符是小写字母“S”
    • 您的类更愿意匹配
      com.sample.*.
      (子包!),而不仅仅是
      com.sample.*.
  • 因此,您可以匹配子包类中的所有
    save()
    方法,如:
    execution(*com.sample.*.save(..)
    。第一个
    *
    a
    d
    的子包,第二个
    *
    是类名
  • 如果要将子包甚至类分层匹配到任何深度,可以使用如下语法:
    execution(*com.sample..save(..)
  • 如果只想匹配任何名称且在所有子包中不带参数的
    public void
    方法,可以使用
    execution(public void com.sample.*())

等等。我希望这能回答你的问题,尽管你不清楚自己到底想知道什么。

你说的“更好”是什么意思?您希望切入点与什么匹配?关于您的问题-“如果这5个类在不同的包中并且具有不同的方法名称,该怎么办?”-如果它们有不同的名称,您仍然需要一些共同的模式,以便您可以创建一个正则表达式,否则该特性将应用于类中的所有方法,这可能不是预期的。非常感谢,您的回答确实消除了许多疑问。我有一点怀疑。类A、B、C、D和E必须是带有@service或@Component注释的服务层类?
package com.sample.d;
Class D{
    public void save(){
    }
}
package com.sample.e;
Class E{
    public void save(){
    }
}
<aop:aspectj-autoproxy />
<bean id="sampleAspectJ" class="com.sample.xxxxxxxx" />
/**
 * aspect class that contains after advice 
 */
package com.sample;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class SpringAopSample{

    @After(value = "execution(* com.sample.*.Save(..))")
    public void test(JoinPoint joinPoint) {


        System.out.println("Hello World");



    }

}