springboot注解@Before和@After的⽤法
⾸先,新建⼀个需要切⾯拦截的⽅法,再这个⽅法执⾏前以及执⾏后我们需要⽆耦合的添加⼀些提前后滞后的处理。package com.fpga.java.api.impl;
@Component
@Service(timeout =5000)
public class FPGAComputeServiceImpl implements FPGAComputeService{
@Override
public Map<String, String>send(int uid, String chipId,int chipType, String data){
……
}
/**
* @param uid ⽤户ID
* @param chipType 芯⽚类型
*/
public Map<String, String>result(int uid,int chipType){
……
}
}
然后新建⼀个切⾯类:
package com.fpga.java.api.aop;
import flect.Modifier;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
springboot aop
public class FPGAComputeServiceAop {
@Before(value ="execution(* com.fpga.java.api.impl.FPGAComputeServiceImpl.*(..))")
public void beforeAdvice(JoinPoint joinPoint){
System.out.println("⽬标⽅法名为:"+ Signature().getName());
System.out.println("⽬标⽅法所属类的简单类名:"+ Signature().getDeclaringType().getSi
mpleName());        System.out.println("⽬标⽅法所属类的类名:"+ Signature().getDeclaringTypeName());
System.out.println("⽬标⽅法声明类型:"+ Signature().getModifiers()));
//获取传⼊⽬标⽅法的参数
Object[] args = Args();
for(int i =0; i < args.length; i++){
System.out.println("第"+(i+1)+"个参数为:"+ args[i]);
}
System.out.println("被代理的对象:"+ Target());
System.out.println("代理对象⾃⼰:"+ This());
}
@After(value ="execution(* com.fpga.java.api.impl.FPGAComputeServiceImpl.*(..))")
public void afterAdvice(JoinPoint joinPoint){
System.out.println("⽬标⽅法名为:"+ Signature().getName());
System.out.println("⽬标⽅法所属类的简单类名:"+ Signature().getDeclaringType().getSimpleName());        System.out.println("⽬标⽅法所属类的类名:"+ Signature().getDeclaringTypeName());
System.out.println("⽬标⽅法声明类型:"+ Signature().getModifiers()));
//获取传⼊⽬标⽅法的参数
Object[] args = Args();
for(int i =0; i < args.length; i++){
System.out.println("第"+(i+1)+"个参数为:"+ args[i]);
}
System.out.println("被代理的对象:"+ Target());
System.out.println("代理对象⾃⼰:"+ This());
}
}
随意测试下
结果:
⽬标⽅法名为:send
⽬标⽅法所属类的简单类名:FPGAComputeServiceImpl
⽬标⽅法所属类的类名:com.fpga.java.api.impl.FPGAComputeServiceImpl
⽬标⽅法声明类型:public
第1个参数为:0
第2个参数为:111
第3个参数为:0
第4个参数为:222
被代理的对象:com.fpga.java.api.impl.FPGAComputeServiceImpl@607dbd4f
代理对象⾃⼰:com.fpga.java.api.impl.FPGAComputeServiceImpl@607dbd4f
⽬标⽅法名为:send
⽬标⽅法所属类的简单类名:FPGAComputeServiceImpl
⽬标⽅法所属类的类名:com.fpga.java.api.impl.FPGAComputeServiceImpl
⽬标⽅法声明类型:public
第1个参数为:0
第2个参数为:111
第3个参数为:0
第4个参数为:222
被代理的对象:com.fpga.java.api.impl.FPGAComputeServiceImpl@607dbd4f
代理对象⾃⼰:com.fpga.java.api.impl.FPGAComputeServiceImpl@607dbd4f
@Aspect:作⽤是把当前类标识为⼀个切⾯供容器读取
exection表达式基本语法格式为:
执⾏(<;修饰符模式>?<;返回类型模式> <⽅法名模式>(<;参数模式>)<;异常模式>?)除了返回类型模式,⽅法名模式和参数模式外,其它项都是可选的。
execution(public * ArithmeticCalculator.*(…))
含义:ArithmeticCalculator接⼝的所有公有⽅法
execution(public double ArithmeticCalculator.*(…))
含义ArithmeticCalculator接⼝中返回double类型数值的⽅法
execution(public double ArithmeticCalculator.*(double, …))
含义第⼀个参数为double类型的⽅法。
“…” 匹配任意数量、任意类型的参数。
execution(public double ArithmeticCalculator.*(double, double))
含义参数类型为double,double类型的⽅法
切⼊点表达式可以通过 “&&”、“||”、“!”等操作符结合起来。
execution (* .add(int,…)) || execution( *.sub(int,…))含义任意类中第⼀个参数为int类型的add⽅法或sub⽅法
切⽚注解:
@Before: 前置通知, 在⽅法执⾏之前执⾏
@After: 后置通知, 在⽅法执⾏之后执⾏ 。
@AfterRunning: 返回通知, 在⽅法返回结果之后执⾏
@AfterThrowing: 异常通知, 在⽅法抛出异常之后
@Around: 环绕通知, 围绕着⽅法执⾏

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。