关于跨领域关注的有趣的AOP问题?

时间:2009-10-05 21:35:05

标签: java aop spring-aop

考虑一组具有与此

类似的方法的DOA
public void addObject(Long sessionId, Long clientId, Dom obj){...}

现在每个域pojo(Dom)都有sessionId属性,对于每个插入,更新或删除域对象,sessionId必须与setSessionId(Long sessionId)一起传递我们可以知道谁做了什么。但似乎这会切断所有数据访问的内容我们和我认为AOP是一个很好的工具,可以在sessionId@Before(JoinPoint)建议中插入@Around(ProceedingJoinPoint)。这实际上是否可行? DAO主要是基于Hibernate的Spring StoredProcedure

3 个答案:

答案 0 :(得分:1)

DAO层周围的拦截器将难以计算传递持久性,即hibernate操作(保存,删除,...)级联到关联实体。 Hibernate会话拦截器可以。

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

答案 1 :(得分:1)

我不明白为什么你不能这样做,我实际上在过去做过类似的事情(有点复杂),帮助我不要对每一堂课进行交叉重构!

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

答案 2 :(得分:1)

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

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

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