📜  Spring AOP-实现(1)

📅  最后修改于: 2023-12-03 15:20:12.402000             🧑  作者: Mango

Spring AOP-实现

简介

Spring AOP(Aspect Oriented Programming)是 Spring 框架中的一个模块,提供面向切面编程的支持。它主要是通过代理方式来实现切面功能,不改变原有类的代码,可以在不影响原有业务逻辑的情况下,将“面向切面编程”的功能加到系统中。

实现方法
1. 编写切面类

在 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;
    }

}
2. 配置切面类

配置切面类可以通过注解或XML方式实现,这里采用XML配置方式。

<beans...

<!-- 定义切面类 -->
<bean id="myAspect" class="com.example.demo.aspect.MyAspect"/>

<!-- 开启 Spring AOP -->
<aop:aspectj-autoproxy/>

</beans>
3. 应用切面

在需要应用切面的地方,我们需要通过注解或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配置,可以快速实现各种切面功能,从而提高系统的可维护性和可扩展性。