使用 AOP 和 Spring 引导进行多重审计 table
Multiple Audit table by using AOP and Spring Boot
我想创建审计方面,它将根据设计存储一些主要实体类型的不同审计。我创建了像 @Auditing
这样的注释,我在其中定义了审计类型变量。这将在方法级别进行注释。我在哪里添加审计 table 用于方面设计中主要实体的逻辑?
举个例子:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auditing {
Event event();
}
方面设计:
@Aspect
@Component
public class AuditAspect {
@AfterReturning(value = "@annotation(auditable)")
public void save(Auditing audit) {
Audit auditInfo = new Audit();
// I plan to add some condition here by entity type
}
}
我计划在审计实体创建后添加一些条件,例如“哪个 table 用于按类型审计存储”?这样好吗?
如果您担心性能,据我所知,Aspect
代码在应用程序引导过程中只会被编织到您自己的代码中一次,所以那里没有问题。
本质上是这样一种方法:
@Auditing
public void test(){
// method logic
}
变成
@Auditing
public void test(){
Audit auditInfo = new Audit();
// extra auditing logic...
// method logic
}
所以只要方面方法体不是执行时间很长的东西,你就不应该有问题。但是,如果审计方面也访问数据库并且您的 Audited 方法被频繁调用,您可能会有很大的开销。将所有审计更新添加到一个集合中并以批处理方式定期执行它们可能会更好。
现在关于你应该把 table 断言代码放在哪里,我的意见在方面。否则,您必须为每个 table 创建不同的方面,这首先要点。但是,请检查您是否真的可以将 table 名称作为注释参数传递并在您的方面内访问它。
您理想中想要的是:
@Auditing(tableName="AUDIT_TABLE_1")
public void auditableMethod() {
// logic
}
@Aspect
public void audit(Auditing audit) {
String table = audit.tableName;
// do your jdbc logic
}
我想创建审计方面,它将根据设计存储一些主要实体类型的不同审计。我创建了像 @Auditing
这样的注释,我在其中定义了审计类型变量。这将在方法级别进行注释。我在哪里添加审计 table 用于方面设计中主要实体的逻辑?
举个例子:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auditing {
Event event();
}
方面设计:
@Aspect
@Component
public class AuditAspect {
@AfterReturning(value = "@annotation(auditable)")
public void save(Auditing audit) {
Audit auditInfo = new Audit();
// I plan to add some condition here by entity type
}
}
我计划在审计实体创建后添加一些条件,例如“哪个 table 用于按类型审计存储”?这样好吗?
如果您担心性能,据我所知,Aspect
代码在应用程序引导过程中只会被编织到您自己的代码中一次,所以那里没有问题。
本质上是这样一种方法:
@Auditing
public void test(){
// method logic
}
变成
@Auditing
public void test(){
Audit auditInfo = new Audit();
// extra auditing logic...
// method logic
}
所以只要方面方法体不是执行时间很长的东西,你就不应该有问题。但是,如果审计方面也访问数据库并且您的 Audited 方法被频繁调用,您可能会有很大的开销。将所有审计更新添加到一个集合中并以批处理方式定期执行它们可能会更好。
现在关于你应该把 table 断言代码放在哪里,我的意见在方面。否则,您必须为每个 table 创建不同的方面,这首先要点。但是,请检查您是否真的可以将 table 名称作为注释参数传递并在您的方面内访问它。
您理想中想要的是:
@Auditing(tableName="AUDIT_TABLE_1")
public void auditableMethod() {
// logic
}
@Aspect
public void audit(Auditing audit) {
String table = audit.tableName;
// do your jdbc logic
}