代码之家  ›  专栏  ›  技术社区  ›  sof

方法中间的横切关注点

  •  3
  • sof  · 技术社区  · 16 年前

    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
    }
    

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  4
  •   Sean Patrick Floyd    16 年前

    withincode(* YourClass.methodX(. .))
    

    这允许您通知给定方法执行中的所有连接点

    阅读 AspectJ in Action 更多信息,这是一本关于AspectJ和SpringAOP的好书。


    编辑:

    下面是一些示例代码:

    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/AJDT运行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?
    
        2
  •  2
  •   saret    16 年前

    虽然有些AOP实现可能允许您这样做,但这可能表明需要将这些方法重构为更为组合的方法,因为如果需要将关注点横切到方法中间,它们可能会做得太多。

    methodX 
    {
        usercodemethod1();
        usercodemethod2();
    }
    
    usercodemethod1
    {
        user code x1
        crosscut code
    }
    
    usercodemethod2
    {
        user code x2
        crosscut code
    }