我在我的项目中使用了spring和ibatis,这是我的问题。
我想跟踪所有更改add/update/delete
并将它们记录到 table 中T_TRACE_LOG
。该表有列:operation_type, object_type, log_content, log_date
。
这是一个示例记录:
"add", "customer", "name='andy',age=23,...", 2012-06-14 17:04:57.410
log_content 来自Customer.toString()
,我希望这个过程自动进行,所以我想到了 AOP。
我无法控制客户端代码,因为一些用途addCustomer()
和一些用途insertCustomer()
和其他用途createCustomer()
。但他们最后都打电话getSqlMapClientTemplate().insert("inserCustomer", Customer)
了。所以我想切入点getSqlMapClientTemplate().insert()
来匹配它们。
这是我的尝试,但它不起作用:
<aop:pointcut expression="execution(* org.springframework.orm.ibatis.SqlMapClientTemplate.insert(..))" id="insertLogPointCut"/>
如果我将表达式更改如下:
<aop:pointcut expression="execution(* com.xxx.CustomerDaoImpl.insert(..))" id="logPointCut"/>
因为AOP是根据源码把“切入点信息”编译成类字节码,所以我认为不可能在ibatis类上切入点。如果错了,我的情况如何处理?
这是配置:
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="traceLogger" class="com.xx.TraceLogger"/>
<aop:config>
<aop:pointcut expression="execution(* com.xx.CustomerDaoImpl.insert(..))" id="insertLogPointCut"/>
<aop:aspect id="logAspect" ref="traceLogger">
<aop:after-returning method="logAfterReturning" pointcut-ref="insertLogPointCut"/>
</aop:aspect>
</aop:config>