是否有可能对第三方课程进行切入点以及如何进行?

时间:2012-06-14 09:34:52

标签: java spring aop ibatis pointcut

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

1 个答案:

答案 0 :(得分:1)

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

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

您可以选择

  1. 使用cg-lib进行代理创建,或
  2. 将您的bean更改为使用SqlMapClientOperations而不是SqlMapClientTemplate,并将writecut切换为“execution(* org.springframework.orm.ibatis.SqlMapClientOperations.insert(..))”
  3. 我会推荐方法2。

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