前言:實現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);
}
}