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
相关产品推荐
相关产品推荐

