前言:实现AOP切面编程,第一种是以@before,@After,@Around系统注解实现,另外一种是自定义注解实现AOP,自定义注解更加灵活
1.引入aop依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.编写测试controller
@RestController
@RequestMapping("aop/")
public class AopController {
@Autowired
private AopService aopService;
@GetMapping("testAop")
public String testAop(){
return aopService.testAop("测试AOP");
}
@GetMapping("selectYear")
public String selectYear(String message){
return aopService.selectYear(message);
}
}
3.定义切面类(系统注解实现)
/*
* 定义切入点指定方法selectYear,String为参数类型,message为参数值
* public * com.boot.bjiang.aop.controller.AopController.* (..))这种指定方式类里面的所
* 有方法都拦截
* */
/*
* before注解实现的是在方法之前执行
* */
@Before("execution(public * com.boot.bjiang.aop.controller.AopController.selectYear (String))&&args(message))")
public void beforeAspect(String message){
log.info(message);
}
/*
* After注解实现的是在方法之后执行
* */
@After("execution(public * com.boot.bjiang.aop.controller.AopController.selectYear (String))&&args(message))")
public void AfterAspect(String message){
log.info("return message={}",message);
}
/**
* 执行返回通知
* */
@AfterReturning(value = "execution(public * com.boot.bjiang.aop.controller.AopController.selectYear (String))&&args(message))",returning ="response")
public void AfterReturning(String message,String response){
log.info("入参={},返回={}",message,response);
}
/**
* @description 使用环绕通知,优势在于不需要before和After,一个注解实现两种功能
*/
@Around("execution(public * com.boot.bjiang.aop.controller.AopController.selectYear (String))&&args(message))")
public void doAroundGameData(ProceedingJoinPoint pjp, String message) throws Throwable {
try{
log.info("方法开始执行messege={}",message);
pjp.proceed();
log.info("方法执行结束messege={}",message);
}
catch(Exception e){
log.error(e.getMessage(),e);
}
}
4.自定义注解实现aop,更加灵活实现切面编程。将自定义的注解添加到需要实现AOP的方法上面,更加灵活
A .编写注解
/**
* 自定义注解实现AOP
* */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogAspect {
String value() default "自定义注解拦截";
}
B.将注解添加到需要拦截的方法上
@GetMapping("selectYear")
@LogAspect
public String selectYear(String message){
return aopService.selectYear(message);
}
C.定义切面方法
/**
* 自定义注解拦截
* */
@Around("@annotation(com.boot.bjiang.aop.aspect.LogAspect)")
public void doAroundGameData(ProceedingJoinPoint pjp) throws Throwable {
try{
Object[] message=pjp.getArgs();
log.info("方法开始执行messege={}", JSON.toJSONString(message));
pjp.proceed();
log.info("方法执行结束messege={}",JSON.toJSONString(message));
}
catch(Exception e){
log.error(e.getMessage(),e);
}
}