使用AOP和Spring启动多个Audit表

时间:2017-06-26 08:01:11

标签: java spring-boot aop

我想创建审计方面,根据设计,按一些主要实体类型存储不同的审计。我创建了像@Auditing这样的注释,我定义了审计类型变量。这将在方法级别注释。我在哪里添加审计表用于方面设计中的主实体的逻辑?

只是示例:

@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 like Which table is use for audit store by type? is this good?


    }


}

我打算在审计实体创建之后添加一些条件,比如哪个表按类型用于审计商店?这很好吗?

1 个答案:

答案 0 :(得分:0)

如果你担心性能问题,根据我的知识Aspect代码在应用程序引导期间只编译一次你自己的代码,所以那里没有问题。

基本上是这样的方法:

@Auditing
public void test(){
  // method logic
}

变为

@Auditing
public void test(){
   Audit auditInfo = new Audit();
  // extra auditing logic...

  // method logic
}

因此只要方法方法体不是具有较长执行时间的东西,就不应该有问题。但是,如果审计方面也访问数据库并且经常调用您的审计方法,则可能会产生很大的开销。将所有审计更新添加到集合中并定期以批处理方式执行它们可能会更好。

现在关于你应该把表断言代码放在哪里,我的观点是在这个方面。否则,您必须为每个表创建不同的方面,这些方面首先胜过这一点。但是,请检查您是否可以将表名实际作为annoatation参数传递,并在您的方面内访问它。

您理想的是:

@Auditing(tableName="AUDIT_TABLE_1")
public void auditableMethod() {
  // logic
}

@Aspect
public void audit(Auditing audit) {
  String table = audit.tableName;
  // do your jdbc logic
}