0

我在我的项目中使用了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>
4

1 回答 1

1

Spring 中的默认 AOP 行为仅适用于接口(因为它使用 Java 的动态代理)。如果切入点设置在具体类上,它将不起作用。

SqlMapClientTemplate,如果我没记错的话,是一个类。

您可以选择

  1. 使用 cg-lib 创建代理,或
  2. 将您的 bean 更改为使用 SqlMapClientOperations 而不是 SqlMapClientTemplate,并将切入点写为“execution(* org.springframework.orm.ibatis.SqlMapClientOperations.insert(..))”

我将推荐方法2。

而且,你的猜测是错误的。AOP 相关的东西没有编译成相应的字节码。它们都是在运行时完成的(对于 Spring 的情况)

于 2012-06-14T10:40:13.457 回答