gpt4 book ai didi

java - 方法中间的横切关注点

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:57:04 27 4
gpt4 key购买 nike

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
}

谢谢!

最佳答案

Spring AOP 无济于事,因为它只理解 execution() 切入点。

AspectJ 包含更多切入点,包括 withincode() 构造,这听起来像您想要的:

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/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?

关于java - 方法中间的横切关注点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3504486/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com