如何使用aop识别方法的特定参数?

时间:2018-06-10 15:01:28

标签: java aop aspectj spring-aop aopalliance

我想在AOP中@Before。我有一个dto,我实现了一个接口,在控制器方法中,dto是参数之一,因为它实现了接口,我想在点切割中用已实现的接口识别参数。我试过以下

员工.java

package com.example.demo;

public class Employee implements UserData {

private String name;
private String id;
private String clazz;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getClazz() {
    return clazz;
}

public void setClazz(String clazz) {
    this.clazz = clazz;
}

@Override
public String getData() {
    String data=name+"_"+id;
    return data;
}

}

控制器

@RestController
public class HelloController {

@RequestMapping("/")
public String getEmployees(Employee emp) {
    return "emp";
}

接口

public interface Tenant {

String getData();
}

方面

@Before("pointcut(tenant)")
public void before(Tenant tenant){


}   
@Pointcut("execution(* com.example.demo.*.*(UserData))"+" && 
 args(UserData))")
public void pointcut(UserData UserData) {
    System.out.println("In aspect********************"+UserData.getData());
}
}

这里在上面的方面,UserData被nt识别为Employee的实例。如何实现?我可以把(..)放在切点但我希望它特定于UserData。

2 个答案:

答案 0 :(得分:0)

您使用@Before注释提供了错误的参数。我们需要提供JoinPoint作为参数。

  @Before("execution(* com.example.demo.HelloController.getEmployees*(UserData))")
    public void before(JoinPoint jp){
    System.out.println("In aspect********************");

}

JointPoint有方法getArgs(),你可以用它来获取参数。

答案 1 :(得分:0)

用户 Gaurav Srivastav 对于您的建议的JoinPoint参数是正确的,但您既不需要*中的getEmployees*也不需要getArgs()你只想限制切入点匹配。

您需要使用完全限定的类名(包括包)才能指定参数类型...

@Before("execution(* com.example.demo.HelloController.getEmployees(com.example.demo.UserData))")
public void before(JoinPoint thisJoinPoint) {
  System.out.println(thisJoinPoint);
}

...或者,如果您需要访问method参数,可以通过args()切入点指示符绑定它:

@Before(
  "execution(* com.example.demo.HelloController.getEmployees(*)) && " + 
  "args(userData)"
)
public void before(JoinPoint thisJoinPoint, UserData userData) {
  System.out.println(thisJoinPoint);
  System.out.println("  " + userData);
}