在Spring框架中,增强(Advices)是指在目标对象的方法执行过程中,为了实现横切关注点的重用和分离,而织入到目标对象方法执行前后的一段逻辑代码。通过增强,可以在不修改原有业务逻辑的情况下,实现与业务逻辑相对独立的功能。
Spring框架提供了五种常见的增强类型,分别是:
-
前置增强(Before Advice):在目标方法执行之前执行的逻辑。前置增强可用于记录日志、检查参数等操作。
-
后置增强(After Returning Advice):在目标方法正常返回后执行的逻辑。后置增强可用于记录日志、对返回值进行加工等操作。
-
异常增强(After Throwing Advice):在目标方法抛出异常后执行的逻辑。异常增强可用于记录异常信息、进行异常处理等操作。
-
环绕增强(Around Advice):在目标方法执行前后均可执行的逻辑。环绕增强可用于实现事务管理、性能监控等复杂逻辑。
-
最终增强(After Advice):在目标方法执行结束后执行的逻辑,无论是否发生异常都会执行。最终增强可用于资源释放、清理工作等操作。
通过在Spring中使用AOP(面向切面编程)的方式,可以将增强逻辑与目标对象方法解耦,实现对横切关注点的统一管理。通常,我们可以通过使用Spring AOP的注解或配置方式,定义切面(Aspect),并将增强逻辑应用到目标对象的方法上,从而实现所需的增强功能。
一、前置增强
@Before
@Before("execution(* 目标对象方法"))
@Before("execution(* com.guigu.service.impl.*.*(..))")
public void begin(JoinPoint joinPoint){
System.out.println("开启事务");
}
二、后置增强
@AfterReturning("execution(目标对象方法)")
@AfterReturning("execution(* com.guigu.service.impl.*.*(..))")
public void commit(){
System.out.println("事务提交");
}
三、异常增强
@AfterThrowing(("execution(目标对象 )"))
@AfterThrowing(("execution(* com.guigu.service.impl.*.*(..) )"))
public void rollback(){
System.out.println("事务回滚");
}
四、最后增强
@After 在目标方法执行结束后执行的逻辑,无论是否发生异常都会执行
五、环绕增强
@Around 可以包含前面四个增强,所以可以用环绕增强写,也可以使用前面四个分开写
@Around("execution(* com.guigu.service.impl.*.*(..))")
public Object transaction(ProceedingJoinPoint joinPoint){
//保证目标方法被执行即可
Object[] args = joinPoint.getArgs();
Object result = null;
try {
//增强代码 -> before
System.out.println("开启事务");
result = joinPoint.proceed(args);
System.out.println("提交事务");
} catch (Throwable e) {
System.out.println("事务回滚");
throw new RuntimeException(e);
}finally {
}
return result;
}