我在项目中使用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>
最佳答案
Spring中的默认AOP行为仅适用于接口(因为它正在使用Java的动态代理)。如果切入点设置在一个具体的类上,它将不起作用。
如果我没记错的话,SqlMapClientTemplate是一个类。
您可以选择
使用cg-lib进行代理创建,或
更改您的bean以使用SqlMapClientOperations而不是SqlMapClientTemplate,并将切入点写为“ execution(* org.springframework.orm.ibatis.SqlMapClientOperations.insert(..))”
我将推荐方法2。
而且,您的猜测是错误的。 AOP相关的内容未编译为相应的字节码。它们都在运行时完成(对于Spring而言)