java - 调用对应的 set 方法时获取对象值
问题描述
我想使用spring AOP(@Before)获取修改对象的值。我有以下课程:
package com.mypack;
public class Person {
private String id;
private String firstName;
private String lastName;
public String getId() { return id; }
public String getFirstName() { return firstName; }
public String getLastName() { return lastName; }
public void setId(String id) { this.id = id; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public void setLastName(String lastName) { this.lastName = lastName; }
public String toString() { return "Person[" + id + ",
+ firstName + ", " + lastName+ "]"; }
}
细节类:
package com.mypack;
public class Details extends Person{
private String address;
private String contactNum;
//getters and setters
public String toString() { return "Details[" + address + ",
" + contactNum+ "]"; }
}
AspectSetterInterceptor 类:
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class AspectSetterInterceptor {
@Before("execution(* com.mypack.Details.set*(*))")
public void before(JoinPoint joinPoint) throws Throwable {
Object[] signatureArgs = joinPoint.getArgs();
for (Object signatureArg : signatureArgs) {
Person obj = (Person) signatureArg;
System.out.println("Before : " + obj.getFirstName() + " ---- "
+ obj.getId());
}
}
}
测试类:
public class ChangeTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AspectConfig.class);
ctx.refresh();
//Details userService = ctx.getBean(Details.class);
Details obj1 = new Details();
obj1.setAddress("xx 202");
obj1.setContactNum("2124551234");
obj1.setId("242");
obj1.setFirstName("John");
obj1.setLastName("John");
Details obj2 = new Details();
obj2.setAddress("ASDf 202");
obj2.setContactNum("234544565656");
obj2.setId("23689");
obj2.setFirstName("Sam");
obj2.setLastName("S");
System.out.println("obj1 : " + obj1);
System.out.println("obj2 : " + obj2);
obj2.setFirstName("Samuel");
}
}
也尝试过这里提到的Spring AOP - 在调用 setter 之前获取旧字段值
--EDITED--- 当 ChangeTest 类被执行时,它正在打印 obj1 和 obj2 的值(toString() 方法在类中被覆盖)。它没有达到 AspectSetterInterceptor 中提到的 before(..) 方法。请指教。
PS:我的方案是在有人使用 set*(..) 方法时点击 @Before 方面。在上面的例子中,我给出了一个简单的类 Details,它扩展了 Person 类,所以无论何时在这些类中调用 set*(..) 方法,都应该调用切面 @before,同样我希望在我的应用程序中使用任何 set**( ..) 方法被调用我想调用@Before。有没有更好的方法可以遵循.TIA。
解决方案
您的切入点定义@Before("execution(* com.mypack.set*(*))")
意味着它会在 class 的所有 setter 上触发mypack
。
你想要的大概是
@Before("execution(* com.mypack.Person.set*(*))") // all setters on person
或者
@Before("execution(* com.mypack.*.set*(*))") // all setters on all classes in package
或者
@Before("execution(* com.mypack..set*(*))") // all setters in all classes in all subpackages
推荐阅读
- r - 管道中的map2()函数
- php - Eloquent ORM 连接参数的意外 var_dump
- php - 如何在 Symfony 的控制器中获取搜索查询的总数
- django - 按钮在注册表单中不起作用
- php - WordPress 自定义主题,PHP 问题
- c# - 为什么我的简单转向论点由于某种原因不会响应?(2D)
- jenkins - 如何配置 Jenkins 性能插件以使具有相对错误阈值的作业失败
- hosts - MAMP Pro 安装中的所有主机都服务于相同的主机/根目录,即使该主机被禁用?
- ms-access - MS-Access VB 脚本将字符串转换为日期
- python - 如何使用其他 json 文件中的值更新 json 文件?