Я разрабатываю систему, в которой мне нужно передать аргумент из вызываемого метода в метод совета. Я предоставляю простой код, чтобы прояснить суть дела -

//AOPMain.java:

public class AOPMain {

public static void main(String[] args) {
    ApplicationContext cxt = new ClassPathXmlApplicationContext("spring.xml");

    Employee emp = cxt.getBean("employee", Employee.class);

    emp.sayHello();
}

}

//Employee.java:

public class Employee {

private String name;

public String getName() {
    System.out.println("getName");
    return name;
}

public void setName(String name) {
    System.out.println("setName");
    this.name = name;
}

public void sayHello() {
    System.out.println("Hello World!");
    //How to pass argument to afterAdvice
}

}

//Logging.java:

 @Aspect
public class Logging {

    @Pointcut("execution(public void sayHello())") 
    public void doSomething(){}         

    @After("doSomething()")             
    public void afterAdvice() {
        System.out.println("After Advice");
        //Depending on the argument passed, send notification
    }
}

Как я могу разработать эту систему? Я знаю, что есть способы передать аргумент в метод advice из самого AOPMain с помощью && args (), но я не могу найти образец кода для этой конкретной проблемы.

Я знаю, что это нарушает основной принцип дизайна, что метод совета не является слабосвязанным. Так поддерживает ли это Spring?

Заранее спасибо.

1
Nirmalya 27 Окт 2015 в 10:49

2 ответа

Лучший ответ

Есть два способа получить информацию из рекомендованного метода:

  • пусть он вернет значение и использует это возвращаемое значение в совете:

    public Arg sayHello() {
        System.out.println("Hello World!");
        //How to pass argument to afterAdvice
        Arg arg = ...;
        return arg;
    }
    
    @AfterReturning(pointcut="doSomething()", returning="retval")             
    public void afterAdvice(Object retval) {
        System.out.println("After Advice");
        // use retval here ...
    }
    
  • используйте JoinPoint, чтобы получить доступ к исходному объекту, для которого был вызван метод, и передайте arg как атрибут объекта:

    public void sayHello() {
        System.out.println("Hello World!");
        //How to pass argument to afterAdvice
        this.arg = ...;
    }
    
    @After("doSomething()")             
    public void afterAdvice(JoinPoint jp) {
        System.out.println("After Advice");
        Employee emp = (Employee) jp.getTarget();
        // use emp.arg here ...
    }
    

    Это имеет смысл только в том случае, если рекомендованный объект имеет состояние - не думайте об использовании его в службе или контроллере, которые являются общими объектами ...

1
Serge Ballesta 27 Окт 2015 в 09:54
@After("doSomething()")             
public void afterAdvice(JoinPoint joinPoint) {
   System.out.println("After Advice");
   //joinPoint.getArgs(); 
   //Depending on the argument passed, send notification
}

Не решает вашу проблему? Обратитесь к get-method-arguments-using-spring-aop, чтобы узнать больше.

1
Community 23 Май 2017 в 12:16