首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法中间的横切关注点

方法中间的横切关注点
EN

Stack Overflow用户
提问于 2010-08-18 00:01:23
回答 2查看 920关注 0票数 3

对于AOP (例如AspectJ,SpringAOP)来说,在下面方法的切入点处理(建议)横切关注点是很方便的。

“三明治”代码

代码语言:javascript
复制
methodA {
    crosscut code
    user code A
    crosscut code
}

methodB {
    crosscut code
    user code B
    crosscut code
}

AOP是否倾向于横切关注点与下面的用户代码重叠?多么?

“意大利面”代码

代码语言:javascript
复制
methodX {
    user code x1
    crosscut code

    user code x2
    crosscut code
}

methodY {

    user code y1
    crosscut code

    user code y2
    crosscut code
}

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-18 00:21:44

Spring AOP不会有帮助,因为它只理解execution()切入点。

AspectJ包含了更多的切入点,包括内部代码()构造,这听起来就是您想要的:

代码语言:javascript
复制
withincode(* YourClass.methodX(. .))

这使您可以建议给定方法执行中的所有连接点

阅读AspectJ in Action获取更多信息,这是一本关于AspectJ和Spring AOP的非常好的书。

编辑:

下面是一些示例代码:

代码语言:javascript
复制
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将生成以下输出:

代码语言:javascript
复制
***************************************************
** 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?
票数 4
EN

Stack Overflow用户

发布于 2010-08-18 00:12:12

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

代码语言:javascript
复制
methodX 
{
    usercodemethod1();
    usercodemethod2();
}

usercodemethod1
{
    user code x1
    crosscut code
}

usercodemethod2
{
    user code x2
    crosscut code
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3504486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档