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

@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; } }
配置:

<?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>
实现:
@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; } }