call
和
execution
的指示符分别为
call
(
Method-Signature
)、
execution
(
Method-Signature
),匹配方法签名的方法或构造函数的执行。
对于
call
来说,调用的连接点位于方法调用点的调用代码处;对于
execution
来说,执行的连接点位于方法执行的位置。也就是说,
call
和
execution
的重要区别在于它们传递了哪些类型给
AspectJ
编译器以用来与
aspect
进行链接。
通常,我们在使用
call
和
execution
时,从效果上来看并不会觉察出二者的区别。下面给出一个例子说明
call
和
execution
的运行时机及区别。
MyAspectj中的代码:
public aspect MyAspectj {
pointcut callF(): call(* f(..));
before() : callF() {
System.out.println("before call f()");
System.out.println(thisJoinPoint.getThis());
System.out.println(thisJoinPoint.getTarget());
}
}
Test中的代码:
public class Test {
public void foo(){
f();
}
public void f(){
System.out.println("CflowTest.f();");
}
}
Test1中的代码:
public class Test1 {
public void foo1(Test test){
test.f();
}
public static void main(String[] args) {
Test test=new Test();
test.foo();
System.out.println("**************************************");
new Test1().foo1(test);
}
}
Test1中main函数的运行结果:
before call f()
com.gaojian.aspectj.test.Test@141d683
com.gaojian.aspectj.test.Test@141d683
CflowTest.f();
**************************************
before call f()
com.gaojian.aspectj.test.Test1@16a55fa
com.gaojian.aspectj.test.Test@141d683
CflowTest.f();
从输出可以看到,在
execution
中,
this
和
target
指向同一个类
。在
call
中,
this
和
target
不是指向同一个类
。
execution
与
call
还有一点很重要的区别。对于继承类来说,如果它没有覆盖父类的方法,那么
execution
不会匹配子类中没有覆盖父类的方法。比如说我们有一个类
B
继承于
A
,但没有覆盖
A
类的
foo()
,那么对于
B
的实例的
foo()
方法,
execution(* B.foo())
将不会被匹配。
做个总结,如果想跟踪连接点的内部代码运行情况可以考虑使用
execution
,但如果你只关心连接点的签名(比如你使用第三方库或是标准
API
),则使用
call
。
分享到:
相关推荐
在AspectJ中,可以声明的连接点包括方法调用、方法执行、构造器调用、构造器执行、字段获取、字段设置、初始化代码块、静态初始化代码块和异常处理器代码块等。 Pointcut是AspectJ中用于捕获一组特定连接点的表达式...
本指南将深入探讨AspectJ的核心概念、语法以及如何在实际项目中应用。 1. **面向切面编程(AOP)**: AOP是软件工程中的一种编程范式,旨在减少代码的冗余和提高可维护性。通过分离关注点,将横切关注点(如日志、异常...
AspectJ和Spring的整合在Java开发中扮演着重要的角色,特别是在实现面向切面编程(AOP)时。AspectJ是一个强大的、成熟的库,它扩展了Java语言,允许开发者定义和执行切面,这是一种分离关注点的方式,使得业务逻辑...
【工具】AspectJ提供了一整套工具集,包括编译器ajc(AspectJ Compiler)和织入工具AJDT(AspectJ Development Tools),使得在Eclipse等IDE中无缝集成AOP变得可能。ajc可以将切面编译到字节码中,而AJDT则提供了...
在AspectJ中,一个Java程序可以通过添加切面和通知来增强其行为。切面定义了何时何地插入代码,而通知则定义了插入的具体代码。通过这种方式,AspectJ允许开发者以一种更清晰、更解耦的方式处理横切关注点,如日志...
AspectJ是一种强大的面向切面编程(AOP)的Java扩展,它允许开发者在不修改原有代码的情况下,将关注点如日志...在提供的压缩包文件"AspectJ经典实例"中,应该包含了这些示例的详细代码和解释,可供进一步学习和参考。
AspectJ、AspectJRT 和 AspectWeaver 是三个与面向切面编程(AOP)相关的关键组件,它们在Spring框架中有着重要应用,尤其对于初学者来说,理解这些概念是掌握Spring AOP的基础。 AspectJ 是一个强大的Java语言的...
4. **工具集**:AspectJ还提供了工具集,如`aspectjweaver.jar`(运行时织入所需的 weaving agent)和`ajdt`(Eclipse 插件,用于在IDE中支持AspectJ开发)。 5. **许可证**:`license.txt` 文件通常包含了软件的...
标题"spring和aspectj的aop实验"表明我们将探讨如何在Spring中使用AspectJ进行AOP实践。这通常涉及到创建切面、定义通知、配置织入策略以及测试其效果。 1. **什么是AOP** AOP的核心概念是切面(Aspect),它封装...
在软件开发中,面向切面编程(AOP)是一种设计模式,它允许程序员将关注点分离到不同的模块,从而提高代码的可维护性和复用性。AspectJ是Java平台上的一个开源AOP框架,它提供了一种强大的语言级支持来实现切面。...
3. 如何在Java项目中引入和使用AspectJ,包括静态和动态编织的区别。 4. 利用AspectJ进行日志记录、性能监控、事务管理和权限控制等实践案例。 5. 如何调试AspectJ代码,理解其编译过程和运行时行为。 6. 高级特性,...
使用AspectJ 1.9.6.jar时,开发者需要了解其配置方式,包括在Maven或Gradle构建系统中如何添加依赖,以及如何编写和编译AspectJ代码。此外,理解如何在IDE如Eclipse或IntelliJ IDEA中配置AspectJ支持,以便获得更好...
在Day01_AspectJAnno文件夹中,可能包含了关于如何配置和使用AspectJ注解的示例代码和练习,你可以通过查看这些代码加深理解。在学习过程中,实践是非常重要的,尝试自己创建不同的切面和通知,观察其在不同场景下的...
本资源包含的是《精通AspectJ》一书中的示例代码,通过这些代码,读者可以深入理解AspectJ的工作原理和实际应用。 在学习AspectJ时,有几个关键概念是必须掌握的: 1. **切面(Aspect)**:切面是AspectJ的核心,...
在实际应用中,AspectJ可以通过注解或XML配置来声明切面和通知。例如,下面是一个简单的AspectJ注解示例: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") ...
【Aspect-Oriented Programming with AspectJ】是一种编程范式,旨在解决传统面向对象编程中模块化问题,特别是在处理横切关注点(如日志、事务管理、安全性等)时的代码分散和重复。AspectJ是Java平台上的一个开源...
在Spring框架中,AspectJ是一种...通过以上步骤,你可以在Spring应用中成功地导入和使用AspectJ,实现更灵活、模块化的代码结构,提高代码复用性和可维护性。理解并熟练运用AOP是提升Spring应用开发能力的关键之一。
总结来说,通过创建一个AspectJ的Gradle插件,我们可以便捷地将面向切面编程引入到项目中,实现代码的解耦和关注点分离。这个过程涉及Gradle插件的编写、AspectJ的使用以及如何在Gradle构建流程中集成这两个概念。这...
在Spring AOP中使用AspectJ,你需要配置Spring容器来识别和处理切面。这通常涉及到以下步骤: 1. 添加依赖:在你的项目中,你需要包含上述两个JAR文件,并且在Spring配置文件中启用AspectJ自动代理。 2. 定义切面...