我在项目中使用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而言)

10-06 06:45