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());
}
}
Mas quando inicio o aplicativo, obtenho o seguinte resultado:
UserService: Request to create user: create new user john | age: 21
UserService: Request to delete user: john
Então, por que o método beforeUserServiceMethodCall
não chama antes de createUser
/ deleteUser
?
MyAspect: Calling a UserService method:
No seu pointcut
call(* com.myproject.javatestmavenbom.module1.aop.*(..))
, o.*
próximo ao final pode representar um subpacote, uma classe ou um nome de método. Supondo que represente uma classeUserService
, então um subseqüente.*
para o nome do método está faltando. Qualquer uma das seguintes opções funcionará:call(* com.myproject.javatestmavenbom.module1.aop.*.*(..))
- qualquer método de qualquer classe exatamente naquele pacotecall(* com.myproject.javatestmavenbom.module1.aop..*(..))
- qualquer método de qualquer classe neste pacote ou em qualquer um de seus subpacotes (observe a notação de ponto duplo)Se você é novo no AspectJ, observe também que existem pointcuts
call()
eexecution()
, que interceptam coisas diferentes. Na maioria das vezes, você querexecution()
, mas também existem muitos casos de uso válidos paracall()
.