springboot+使用切面AOP動態獲取自定義注解


1.springboot環境下導入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.自定義注解


@Target(value = {ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})//該注解可以放在方法上,屬性上,類上 @Retention(RetentionPolicy.RUNTIME)//運行環境下 public @interface MyLog { String value() default ""; }

3.編寫簡單的controller

@Controller
public class UserController {
  @GetMapping("/listUser")
  @ResponseBody
  @MyLog(value = "日志記錄查看了用戶權限")//自定義注解   public String listUser () {    return "查看用戶權限";   }

}

4.編寫切面類

@Aspect
@Component
public class MyAspec {

    public MyAspec(){
    }

    //切點掃描某個包下某個加了注解的方法,如果只加注解類就會全部掃描
    @Pointcut("execution(* com.qj.shiro.controller.*.*(..)) && @annotation(com.qj.shiro.annotation.MyLog)")
    public void targetMyAspec(){

    }

    //后置通知(可不寫),其他通知省略
    @After("targetMyAspec()")
    public void afterlogin(){
        System.out.println("after。。。。");
    }

   //環繞通知 @Around(
"targetMyAspec()") public Object Interceptor(ProceedingJoinPoint pjp){ Object result = null; Class<?> aClass = pjp.getTarget().getClass();//獲得所在切點的該類的class對象,也就是UserController這個類的對象 String name = pjp.getSignature().getName();//獲取該切點所在方法的名稱,也就是listUser try { Method method = aClass.getMethod(name);//通過反射獲得該方法 MyLog annotation = method.getAnnotation(MyLog.class);//獲得該注解 System.out.println(annotation.value());//獲得自定義注解上面的值 } catch (NoSuchMethodException e) { e.printStackTrace(); } try { result =pjp.proceed();//執行該方法 } catch (Throwable e) { e.printStackTrace(); } return result; } }

5.最終執行

在idea控制台打印如下語句:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM