【问题标题】:Multiple Audit table by using AOP and Spring Boot使用 AOP 和 Spring Boot 的多个审计表
【发布时间】:2019-08-02 03:03:57
【问题描述】:

我想创建审计方面,根据设计存储一些主要实体类型的不同审计。我创建了像 @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
    }
}

我计划在创建审计实体后添加一些条件,例如“哪个表用于按类型进行审计存储”?这样好吗?

【问题讨论】:

    标签: java spring-boot aop


    【解决方案1】:

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

    基本上是这样的方法:

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

    变成

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

    所以只要方面方法体不是执行时间长的东西,你就不应该有问题。但是,如果审计方面也访问数据库并且您的 Audited 方法被频繁调用,那么您可能会有很大的开销。将所有审计更新添加到一个集合中并定期以批处理方式执行它们可能会更好。

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

    你最想要的是:

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

    【讨论】:

    • 对不起,我有不同的问题不是关于性能的。我按实体类型将审计存储到不同的表中。所以我的问题是我应该把代码放在哪里?
    • 请举例说明您是如何访问数据库的。是通过JPA吗? JDBC?春季数据?
    • 它的 JDBC.. (JDBCTemplate)。我想对多个审计实体(如 user_audit_entity、business_audit_entity)使用通用的 Auditable 注释。
    • 我会选择不同的方面选项。这样会更好,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2020-02-24
    • 2017-07-09
    • 2020-08-31
    • 2010-09-21
    • 2018-01-07
    • 2018-04-02
    相关资源
    最近更新 更多