📅  最后修改于: 2023-12-03 15:20:12.402000             🧑  作者: Mango
Spring AOP(Aspect Oriented Programming)是 Spring 框架中的一个模块,提供面向切面编程的支持。它主要是通过代理方式来实现切面功能,不改变原有类的代码,可以在不影响原有业务逻辑的情况下,将“面向切面编程”的功能加到系统中。
在 Spring AOP 中,切面就是通知(advice)与切点(pointcut)的集合。我们可以用注解或XML方式定义切面类,这里以注解方式举例。
@Aspect // 声明为切面类
@Component // Spring 扫描到该类并实例化
public class MyAspect {
// 前置通知
@Before("execution(* com.example.demo.service.*.*(..))")
public void beforeAdvice() {
System.out.println("before advice");
}
// 后置通知
@AfterReturning(pointcut = "execution(* com.example.demo.service.*.*(..))", returning = "result")
public void afterAdvice(Object result) {
System.out.println("after advice, result: " + result);
}
// 异常通知
@AfterThrowing(pointcut = "execution(* com.example.demo.service.*.*(..))", throwing = "e")
public void throwsAdvice(Throwable e) {
System.out.println("throws advice, exception: " + e.getMessage());
}
// 环绕通知
@Around("execution(* com.example.demo.service.*.*(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("around advice 1"); // 前置处理
Object obj = joinPoint.proceed(); // 执行目标方法
System.out.println("around advice 2, result: " + obj); // 后置处理
return obj;
}
}
配置切面类可以通过注解或XML方式实现,这里采用XML配置方式。
<beans...
<!-- 定义切面类 -->
<bean id="myAspect" class="com.example.demo.aspect.MyAspect"/>
<!-- 开启 Spring AOP -->
<aop:aspectj-autoproxy/>
</beans>
在需要应用切面的地方,我们需要通过注解或XML方式声明被代理的对象或方法。
@Service
public class UserService {
public String getUserById(Integer id) {
System.out.println("get user by id: " + id);
return "user";
}
}
<beans...
<bean id="userService" class="com.example.demo.service.UserService"/>
<!-- 应用切面 -->
<aop:config>
<aop:pointcut id="userServicePointcut" expression="execution(* com.example.demo.service.UserService.*(..))"/>
<aop:aspect ref="userAspect">
<aop:before pointcut-ref="userServicePointcut" method="beforeAdvice"/>
<aop:after-returning pointcut-ref="userServicePointcut" returning="result" method="afterAdvice"/>
<aop:after-throwing pointcut-ref="userServicePointcut" throwing="e" method="throwsAdvice"/>
<aop:around pointcut-ref="userServicePointcut" method="aroundAdvice"/>
</aop:aspect>
</aop:config>
</beans>
Spring AOP 提供了方便灵活的面向切面编程支持,通过注解或XML配置,可以快速实现各种切面功能,从而提高系统的可维护性和可扩展性。