Spring AOP:如何将参数从被调用方法传递给通知方法?
Spring AOP: How to pass argument from called method to advice method?
我正在设计一个系统,我需要将参数从被调用方法传递到建议方法。我提供了一个简单的代码来阐明这一点 -
//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
}
}
我该如何设计这个系统?我知道有一些方法可以使用 &&args() 将参数从 AOPMain 本身传递给建议方法,但是我找不到针对这个特定问题的任何示例代码。
我知道这违反了基本的设计原则,建议方法不是松散耦合的。那么Spring支持这个吗?
提前致谢。
@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 了解更多。
有两种方法可以从建议的方法中获取信息:
让它 return 一个值并在建议中使用那个 returned 值:
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 ...
}
只有在建议的对象是有状态的情况下,这个才有意义——不要考虑在作为共享对象的服务或控制器上使用它...
我正在设计一个系统,我需要将参数从被调用方法传递到建议方法。我提供了一个简单的代码来阐明这一点 -
//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
}
}
我该如何设计这个系统?我知道有一些方法可以使用 &&args() 将参数从 AOPMain 本身传递给建议方法,但是我找不到针对这个特定问题的任何示例代码。
我知道这违反了基本的设计原则,建议方法不是松散耦合的。那么Spring支持这个吗?
提前致谢。
@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 了解更多。
有两种方法可以从建议的方法中获取信息:
让它 return 一个值并在建议中使用那个 returned 值:
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 ... }
只有在建议的对象是有状态的情况下,这个才有意义——不要考虑在作为共享对象的服务或控制器上使用它...