普通切面增强,和事务这个切面的执行顺序
时间: 2023-08-18 14:51:26 浏览: 86
在Spring AOP中,切面类可以定义多个增强方法,包括Before、Around、AfterReturning、AfterThrowing等。这些增强方法的执行顺序是由通知类型和切点位置共同决定的。
对于普通切面增强,它的执行顺序是:
1. Before增强方法;
2. 目标方法;
3. AfterReturning增强方法或AfterThrowing增强方法(如果目标方法正常返回,则执行AfterReturning增强方法,否则执行AfterThrowing增强方法);
4. After增强方法。
而对于事务这个切面的执行顺序,则是:
1. Transactional增强方法(Around通知类型);
2. Before增强方法;
3. 目标方法;
4. AfterReturning增强方法或AfterThrowing增强方法(如果目标方法正常返回,则执行AfterReturning增强方法,否则执行AfterThrowing增强方法);
5. After增强方法。
可以看到,在事务切面中,Transactional增强方法会优先于Before增强方法执行。这是因为事务切面需要先开启事务,然后才能执行目标方法和其他增强方法,最后再提交或回滚事务。因此,在事务切面中,Transactional增强方法的执行顺序非常重要,必须保证它是最先执行的。
相关问题
@Transactional切面类
对于问题中的`@Transactional`切面类,根据引用和引用的内容,可以得出以下结论:
1. 如果普通切面没有指定`order`属性,那么它会在`@Transactional`切面之后执行。这是因为Spring框架默认情况下使用`Ordered.LOWEST_PRECEDENCE`作为普通切面的执行顺序,而`@Transactional`切面使用的是`Ordered.HIGHEST_PRECEDENCE`,所以`@Transactional`切面会先于普通切面执行。
2. 在使用切面加分布式锁时,根据引用的内容,应该先尝试获得锁再开启事务。这是因为如果先开启事务再尝试获得锁,当并发较高时,会对数据库带来不小的压力。因此,在切面中应该先执行加锁的逻辑,然后再开启事务。
综上所述,对于`@Transactional`切面类,需要确保它的执行顺序在普通切面之前,并且在切面中应该先执行加锁的逻辑,然后再开启事务。这样可以避免不必要的数据库压力,并保持正确的业务逻辑执行顺序。
阅读全文