SPring AOP注解

public interface Calculator {
    int add(int i, int j);
    int sub(int i, int j);
    int mul(int i, int j);
    int div(int i, int j);
}
View Code
@Component // IOC容器
public class CalculatorImpl implements Calculator {
    @Override
    public int add(int i, int j) {
        int result = i + j;
        System.out.println("方法内部,result:" + result);
        return result;
    }

    @Override
    public int sub(int i, int j) {
        int result = i - j;
        System.out.println("方法内部,result:" + result);
        return result;
    }

    @Override
    public int mul(int i, int j) {
        int result = i * j;
        System.out.println("方法内部,result:" + result);
        return result;
    }

    @Override
    public int div(int i, int j) {
        int result = i / j;
        System.out.println("方法内部,result:" + result);
        return result;
    }
}
View Code

配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--
        AOP注意事项:
        切面类和目标类都需要交给IOC容器管理
    -->
    <context:component-scan base-package="org.example.spring.aop.annotation"></context:component-scan>
    <!--开启基于注解的AOP-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
View Code

实现:

@Component
@Aspect // 将当前组件标记为切面
public class LoggerAspect {
    @Pointcut("execution(* org.example.spring.aop.annotation.CalculatorImpl.*(..))")
    public void pointCut(){

    }

//    @Before("execution(public int org.example.spring.aop.annotation.CalculatorImpl.add(int, int))")
    @Before("pointCut()")
    public void beforeAdviceMethod(JoinPoint joinPoint){
        // 获取连接点对应的方法名
        Signature signature = joinPoint.getSignature();
        // 获取连接点对应的参数
        Object[] args = joinPoint.getArgs();
        System.out.println("LoggerAspect,方法名:" + signature.getName() + ";参数:"+ Arrays.toString(args));
    }

    @AfterReturning(value = "pointCut()", returning = "result")
    public void finallyAdviceMethod(JoinPoint joinPoint, Object result){
        Signature signature = joinPoint.getSignature();
        System.out.println("Logger Aspect,方法:" + signature.getName() + ",结果:" + result);
    }

    @After("pointCut()")
    public void afterAdviceMethod(JoinPoint joinPoint){
        // 获取连接点对应的方法名
        Signature signature = joinPoint.getSignature();
        System.out.println("Logger Aspect,方法:" + signature.getName() + "执行完毕");
    }

    @AfterThrowing(value = "pointCut()", throwing = "ex")
    public void exceptionAdviceMethod(JoinPoint joinPoint, Throwable ex){
        Signature signature = joinPoint.getSignature();
        System.out.println("Logger Aspect,方法:" + signature.getName() + "异常:" + ex);
    }

    @Around("pointCut()")
    // 环绕对象的返回值一定要和目标对象的返回值一致
    public Object aroundAdviceMethod(ProceedingJoinPoint joinPoint){
        Object proceed = null;
        try {
            System.out.println("前置通知");
            proceed = joinPoint.proceed();
            System.out.println("返回通知");
        } catch (Throwable e) {
            System.out.println("异常通知");
            throw new RuntimeException(e);
        }
        finally {
            System.out.println("后置通知");
        }
        return proceed;
    }
}

 

posted @ 2022-11-01 13:30  江境纣州  阅读(17)  评论(0编辑  收藏  举报