Spring Boot中基于子类方法名的声明式事务语义配置问题
解决Spring Boot XML配置AOP匹配BaseService子类公共方法的问题
我懂你现在的困扰——想用Spring AOP的XML配置匹配BaseService子类的所有公共方法却一直没成功,而完整AspectJ能轻松做到对吧?其实问题就出在execution表达式的写法上,调整一下就能搞定。
正确的Pointcut表达式写法
你需要修改<aop:pointcut>里的expression,用execution(public * ppi.nestup.v3.service.BaseService+.*(..))就能精准匹配BaseService及其所有子类的公共方法。这里的+号是核心,它代表匹配该类的所有子类(包括实现类)。
给你完整的配置片段参考:
<aop:config> <aop:pointcut id="services" expression="execution(public * ppi.nestup.v3.service.BaseService+.*(..))"/> <!-- 搭配事务增强示例,按方法名配置不同事务语义 --> <aop:advisor pointcut-ref="services" advice-ref="txAdvice"/> </aop:config> <!-- 事务增强配置示例,可根据方法名自定义规则 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="get*" read-only="true"/> <tx:method name="find*" read-only="true"/> </tx:attributes> </tx:advice>
关键细节说明
BaseService+:这个+是灵魂,它告诉Spring AOP匹配BaseService类/接口,以及所有继承、实现它的子类或实现类。*:代表任意返回类型的方法。.*(..):代表该类下任意方法名、任意参数的方法。- 如果
BaseService是类,Spring Boot默认开启的CGLIB代理会自动处理子类代理;如果是接口,JDK动态代理也能正常匹配实现类。
内容的提问来源于stack exchange,提问作者Jason Carreira
相关产品推荐
相关产品推荐

