对于AOP (例如AspectJ,SpringAOP)来说,在下面方法的切入点处理(建议)横切关注点是很方便的。
“三明治”代码
methodA {
crosscut code
user code A
crosscut code
}
methodB {
crosscut code
user code B
crosscut code
}AOP是否倾向于横切关注点与下面的用户代码重叠?多么?
“意大利面”代码
methodX {
user code x1
crosscut code
user code x2
crosscut code
}
methodY {
user code y1
crosscut code
user code y2
crosscut code
}谢谢!
发布于 2010-08-18 00:21:44
Spring AOP不会有帮助,因为它只理解execution()切入点。
AspectJ包含了更多的切入点,包括内部代码()构造,这听起来就是您想要的:
withincode(* YourClass.methodX(. .))这使您可以建议给定方法执行中的所有连接点
阅读AspectJ in Action获取更多信息,这是一本关于AspectJ和Spring AOP的非常好的书。
编辑:
下面是一些示例代码:
package com.dummy.aspectj;
import java.util.Arrays;
import java.util.Collections;
public class DummyClass{
public static void main(final String[] args){
System.out.println(Arrays.asList("One", Collections.singleton("Two")));
System.out.println("Enough?");
}
}
package com.dummy.aspectj;
import java.util.Arrays;
public aspect DummyAspect{
pointcut callWithinMain() :
withincode(* com.dummy.aspectj.DummyClass.main(..)) // anything inside DummyClass.main
&& call(* *.*(..)); // but only method calls
before() : callWithinMain() {
System.out.println("\n***************************************************");
System.out.println("** Calling:\n**\t"
+ thisJoinPointStaticPart.getSignature()
+ "\n** with arguments:\n**\t "
+ Arrays.deepToString(thisJoinPoint.getArgs()) );
System.out.println("***************************************************\n");
}
}从Eclipse运行DummyClass将生成以下输出:
***************************************************
** Calling:
** Set java.util.Collections.singleton(Object)
** with arguments:
** [Two]
***************************************************
***************************************************
** Calling:
** List java.util.Arrays.asList(Object[])
** with arguments:
** [[One, [Two]]]
***************************************************
***************************************************
** Calling:
** void java.io.PrintStream.println(Object)
** with arguments:
** [[One, [Two]]]
***************************************************
[One, [Two]]
***************************************************
** Calling:
** void java.io.PrintStream.println(String)
** with arguments:
** [Enough?]
***************************************************
Enough?发布于 2010-08-18 00:12:12
虽然有些AOP实现可能允许您这样做,但这可能表明需要将这些方法重构为更具组合性的方法,因为如果需要将关注点横切到方法中间,这些方法可能会做得太多。这样做会得到以下结果:
methodX
{
usercodemethod1();
usercodemethod2();
}
usercodemethod1
{
user code x1
crosscut code
}
usercodemethod2
{
user code x2
crosscut code
}https://stackoverflow.com/questions/3504486
复制相似问题