Java 8
package com.myproject.javatestmavenbom.module1.aop;
public class Main {
public static void main(String[] args) {
UserService userService = new UserService();
userService.createUser("create new user john", 21);
userService.deleteUser("john");
}
}
package com.myproject.javatestmavenbom.module1.aop;
public class UserService {
public void createUser(String name, int age) {
System.out.println("UserService: Request to create user: " + name + " | age: " + age);
}
public void deleteUser(String name) {
System.out.println("UserService: Request to delete user: " + name);
}
}
package com.myproject.javatestmavenbom.module1.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MyAspect {
// Before calling any method in the com.myproject.javatestmavenbom.module1.aop.UserService
@Before("call(* com.myproject.javatestmavenbom.module1.aop.*(..))")
public void beforeUserServiceMethodCall(JoinPoint joinPoint) {
System.out.println("MyAspect: Calling a UserService method: " + joinPoint.getSignature().toShortString());
}
}
但是当我启动应用程序时,我得到以下结果:
UserService: Request to create user: create new user john | age: 21
UserService: Request to delete user: john
那么,为什么方法beforeUserServiceMethodCall
不在createUser
/之前调用deleteUser
?
MyAspect: Calling a UserService method:
在你的切入点中
call(* com.myproject.javatestmavenbom.module1.aop.*(..))
,.*
接近末尾的 可以表示子包、类或方法名。假设它表示类UserService
,那么方法名的后续部分.*
就缺失了。以下任一方法都可以:call(* com.myproject.javatestmavenbom.module1.aop.*.*(..))
- 该包中任何类的任何方法call(* com.myproject.javatestmavenbom.module1.aop..*(..))
- 此包或其任何子包中任何类的任何方法(注意双点符号)如果您是 AspectJ 新手,请注意,AspectJ 中同时存在
call()
和execution()
切入点,它们分别用于拦截不同的内容。大多数情况下,您需要execution()
,但 也有很多有效的用例call()
。