普通切面增强,和事务这个切面的执行顺序
时间: 2023-08-18 16:51:26 浏览: 48
在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`切面类,需要确保它的执行顺序在普通切面之前,并且在切面中应该先执行加锁的逻辑,然后再开启事务。这样可以避免不必要的数据库压力,并保持正确的业务逻辑执行顺序。
Spring中如何让多个AOP顺序加载方式
在Spring中,可以使用@Order注解来指定AOP的加载顺序。具体步骤如下:
1. 在需要进行AOP的类上添加@Aspect注解,表示该类是一个切面
2. 在切面类中定义多个切点和通知
3. 在通知方法上添加@Order注解,指定通知的优先级,数字越小优先级越高(默认优先级为0)
4. 在Spring配置文件中使用<aop:aspectj-autoproxy>标签启用自动代理功能
例如,我们有两个切面类,分别是LoggingAspect和TransactionAspect,其中LoggingAspect负责记录日志,TransactionAspect负责管理事务。我们希望先记录日志再管理事务,那么可以按照以下方式指定顺序:
```
@Aspect
public class LoggingAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
public void servicePointcut() {}
@Before("servicePointcut()")
@Order(1)
public void beforeService() {
System.out.println("记录日志开始");
}
@AfterReturning("servicePointcut()")
@Order(1)
public void afterService() {
System.out.println("记录日志结束");
}
}
@Aspect
public class TransactionAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
public void servicePointcut() {}
@Before("servicePointcut()")
@Order(2)
public void beforeService() {
System.out.println("开启事务");
}
@After("servicePointcut()")
@Order(2)
public void afterService() {
System.out.println("提交事务");
}
}
```
在这个例子中,我们在LoggingAspect和TransactionAspect的通知方法上分别添加了@Order注解,指定了它们的执行顺序。在Spring配置文件中,我们启用了自动代理功能,让Spring自动将切面类转换为代理对象,并在调用服务方法时自动触发切面的通知方法,从而实现AOP功能。