我在项目中使用spring和ibatis,这是我的问题。
我想跟踪add/update/delete
之类的所有更改,并将其记录到表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>
答案 0 :(得分:1)
Spring中的默认AOP行为仅适用于接口(因为它使用的是Java的动态代理)。如果在具体类上设置切入点,它将不起作用。
如果我没记错的话,SqlMapClientTemplate是一个类。
您可以选择
我会推荐方法2。
而且,你的猜测是错误的。 AOP相关的东西没有编译成相应的字节码。它们都是在运行时完成的(对于Spring中的情况)