自定义@Aspect分析返回结果,并保存到数据库中,所以希望在事务结束前处理。
对应方法:
1.自定义@Aspect中增加order,数值定为10。
2.事务的@Aspect中,返回值Advisor设置order为5。
事务拦截的类中直接设置order不起作用,因为@Configuration+@Bean与xml同样作用,要写在新归Advisor处,才相当于
<aop:advisor advice-ref="txAdvice" pointcut-ref="appService" order="2"/>
中设置的order。
原因:
DefaultPointcutAdvisor类继承了Ordered类,Ordered类里默认的order为Integer.MAX_VALUE,这样他总是最里层执行,设置为5之后,比5大的都可以在事务里了。
代码如下:
import java.util.Collections;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource;
import org.springframework.transaction.interceptor.RollbackRuleAttribute;
import org.springframew