【问题标题】:Confirmation message using Spring AOP - AspectJ使用 Spring AOP 的确认消息 - AspectJ
【发布时间】:2015-02-19 10:25:33
【问题描述】:

我正在尝试使用 AspectJ 学习 Spring AOP 实现。 我在不同的包中有 5 个类。

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

package com.sample.b;
Class B {
    public void save(){
    }
}

package com.sample.c;
Class C {
    public void save(){
    }
}

package com.sample.d;
Class D{
    public void save(){
    }
}

package com.sample.e;
Class E{
    public void save(){
    }
}

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

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

<aop:aspectj-autoproxy />

2) 在applicationContext.xml中定义Aspect的引用

<bean id="sampleAspectJ" class="com.sample.xxxxxxxx" />

3) 方面类

/**
 * 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");



    }

}

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

【问题讨论】:

  • “更好”是什么意思?您究竟希望切入点匹配什么?
  • 关于您的问题 - “如果这 5 个类位于不同的包中并且具有不同的方法名称怎么办?” - 如果他们有不同的名字,你仍然需要有一些共同的模式,这样你就可以创建一个正则表达式,否则这个方面将被应用于类中的所有方法,这可能不是预期的。

标签: spring aop aspectj spring-aop


【解决方案1】:

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

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

等等。我希望这能回答您的问题,即使您不清楚您到底想知道什么。

【讨论】:

  • 非常感谢,您的回答确实解开了很多疑惑。
  • 我有点怀疑。 A、B、C、D、E类必须是@Service或@Component注解的服务层类?
猜你喜欢
  • 2015-12-17
  • 1970-01-01
  • 2010-12-09
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多