【问题标题】:Interesting AOP question on a cross cutting concern?关于横切关注点的有趣 AOP 问题?
【发布时间】:2009-10-08 18:13:49
【问题描述】:

考虑一组具有类似方法的 DOA

public void addObject(Long sessionId, Long clientId, Dom obj){...}

现在每个域 pojo (Dom) 都有一个 sessionId 属性,并且对于域对象上的每次插入、更新或删除,sessionId 必须与 setSessionId(Long sessionId) 一起传递,这样我们就可以知道谁做了什么。但这似乎跨越了我们和我认为 AOP 将是在 @Before(JoinPoint)@Around(ProceedingJoinPoint) 建议中插入 sessionId 的所有数据访问内容的好工具。这真的可行吗? DAO 大多基于 Hibernate,并带有一些 Spring StoredProcedure

【问题讨论】:

  • 我很困惑...如果sessionId是Dom对象的一部分,为什么它也是DAo方法中的一个参数?
  • 哎呀我的错误,但要澄清 sessionId 是在代码中手动(以编程方式)设置的,但上面的方法是一个建议的解决方案,其中 AOP 可以插入 sessionId 而无需开发人员处理它。方法签名不正确,因为需要将某些内容传递给 sessionId 的方法。该建议将从实用程序代码中检索 sessionId 并插入它。

标签: java aop spring-aop


【解决方案1】:

您的 sessionId 参数似乎属于 审核方面。在 Hibernate 中,此审计方面通常在 org.hibernate.Interceptor 的实现中实现。

您可以为实体和查询实现许多与生命周期事件相对应的方法。在您的实现中,很容易访问您当前的 sessionId(它可以使用 ThreadLocal 变量)。清晰、干净、快速;-)

这可能比自己使用 AOP 更简单,尤其是当您从 Hibernate 获取生命周期事件的回调时。

【讨论】:

    【解决方案2】:

    您的 DAO 层周围的拦截器将无法解释传递持久性,即级联到关联实体的休眠操作(保存、删除、...)。 Hibernate 会话拦截器可以。

    在任何情况下,如果您的拦截器能够以某种方式发现当前会话 id,则可以采用任何一种方式。

    【讨论】:

      【解决方案3】:

      我不明白你为什么不能这样做,实际上我过去做过类似的事情(稍微复杂一点),帮助我不用交叉重构每个类!

      你有没有想过把 public void addObject(Long sessionId, Long clientId, Dom obj){...} 在父亲/上层阶级中?这个方法可以委托给每个实现..

      【讨论】:

        猜你喜欢
        • 2011-08-01
        • 2020-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-05
        • 1970-01-01
        • 2015-05-31
        • 1970-01-01
        相关资源
        最近更新 更多