You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring AOP:如何在事务开启后、事务方法执行前调用代码?

问题描述

我们需要在insert*、update*等事务方法执行前(必须在事务开启后)执行特定操作。此前通过TransactionProxyFactoryBean的postInterceptors配置CustomBeginChangeAdvice(实现MethodBeforeAdvice)来实现,但现在需切换为<tx:advice> + <aop:config>的XML配置方式(老系统不使用注解),要求不创建自定义代理,同时保留原有功能。

解决方案

直接通过Spring原生AOP组件将原有CustomBeginChangeAdvice集成到新配置中,核心是确保事务开启后再执行该Advice,具体步骤如下:

1. 保留原有Advice实现

CustomBeginChangeAdvice无需修改,继续使用:

public class CustomBeginChangeAdvice implements MethodBeforeAdvice {
  @Override
  public void before(Method method, Object[] params, Object target) throws Throwable {
    // 原有业务逻辑
  }
}

2. 将Advice包装为Spring AOP Advisor

使用DefaultPointcutAdvisor包装原有Advice,指定仅匹配insert*、update*方法,并设置执行顺序:

<!-- 原有的Advice Bean -->
<bean id="beginChangeAdvice" class="some.package.CustomBeginChangeAdvice" />

<!-- 包装为Advisor,控制匹配方法与执行顺序 -->
<bean id="beginChangeAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
    <!-- order值大于事务Advisor,确保事务开启后执行 -->
    <property name="order" value="1" />
    <property name="advice" ref="beginChangeAdvice" />
    <!-- 匹配insert*、update*方法,与事务配置规则一致 -->
    <property name="pointcut">
        <bean class="org.springframework.aop.support.NameMatchMethodPointcut">
            <property name="mappedNames">
                <list>
                    <value>insert*</value>
                    <value>update*</value>
                </list>
            </property>
        </bean>
    </property>
</bean>

3. 调整事务AOP配置

为事务Advice显式设置order(确保优先级高于自定义Advisor),并在<aop:config>中同时注册事务Advisor和自定义Advisor:

<!-- 事务Advice,显式设置order为0,保证先执行以开启事务 -->
<tx:advice id="txAdvice" transaction-manager="integrationTxManager" order="0">
    <tx:attributes>
        <tx:method name="insert*" />
        <tx:method name="update*" />
        <tx:method name="*" read-only="true" />
    </tx:attributes>
</tx:advice>

<aop:config proxy-target-class="true">
    <aop:pointcut id="beans" expression="(bean(firstLogic) || bean(secondLogic) || ...)" />
    <!-- 先注册事务Advisor,优先执行开启事务 -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="beans" />
    <!-- 再注册自定义Advisor,事务开启后执行操作 -->
    <aop:advisor advice-ref="beginChangeAdvisor" pointcut-ref="beans" />
</aop:config>

关键说明

  • 执行顺序控制:Spring AOP中order值越小,Advisor优先级越高。事务Advisor设为0先执行,完成事务开启;自定义Advisor设为1后执行,此时事务已生效,满足需求。
  • 方法匹配:使用NameMatchMethodPointcut确保仅insert*、update*方法触发自定义Advice,与事务配置的方法规则完全对齐。
  • 无自定义代理:全程使用Spring原生AOP和事务组件,无需手动创建代理类,符合老系统的配置习惯。

内容的提问来源于stack exchange,提问作者Wallie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:24:52