spring aop 中@annotation()的使用


在自定義個注解之后,通過這個注解,標注需要切入的方法,同時把需要的參數傳到切面去。那么我們怎么在切面使用這個注解。
我們使用這個自定義注解一方面是為了傳一些參數,另一方面也是為了省事。
具體怎么省事,看我下面的例子就造啦。

一般,別人的切面都是這么寫的
先聲明一個切入點。

//切入點簽名
@Pointcut("execution(* com.lxk.spring.aop.annotation.PersonDaoImpl.*(..))")
private void aa() {
}
切入點聲明OK之后,就是在不同的 advice 里面使用啦。一般都是如下使用。
下面的暫時是不帶注解的
//前置通知
@Before("aa()")

//后置通知
@AfterReturning(value = "aa()", returning = "val")
public void afterMethod(JoinPoint joinPoint, Object val) {}

//最終通知
@After("aa()")

//環繞通知
@Around("aa()")

//異常通知
@AfterThrowing(value = "aa()", throwing = "ex")
public void throwingMethod(Throwable ex) {}
這些切面方法里面的參數。JoinPoint joinPoint,這個是哪個都可以加的。加不加隨意。需要的話就加。是可以用的。


要是帶個咱自定義的注解呢?
我又看到很多人都是如下寫的。
我就不全部帶上了,就以這個after為例,看看是如何寫的吧

@After(value = "aa() && @annotation(methodLog)", argNames = "joinPoint, methodLog")
public void methodAfter(JoinPoint joinPoint, MethodLog methodLog) throws Throwable {}
按照上面這寫,沒毛病,因為別人都是這么寫的,我也確實驗證啦,這個能拿到咱定義的注解,以及注解上的參數。

還有個寫法,就是不用顯示的聲明切入點,就是那個@Pointcut 

先說下這個顯示聲明的好處,就像聲明變量一樣,因為這個切入點表達式是可以用 &&  ||   !來組合條件的,這么聲明的話,可以使得代碼簡潔。
直接在各類 advice 通知的參數上面,使用execution來聲明。
例如:

@Around(value = "(execution(* com.lxk.service..*(..))) && @annotation(methodLog)", argNames = "joinPoint, methodLog")
public Object methodAround(ProceedingJoinPoint joinPoint, MethodLog methodLog) throws Throwable {}
其實,上面的value里面的意思,就是復合那個切入的點的條件, 以&&連接,也就是說2個都符合。
既然咱自定義了注解,就是來干這個切面的,為啥還要對他是哪個包,要限制一下呢,我就把前面的給刪除啦。
最終簡化如下:
@Around(value = "@annotation(methodLog)")
public Object methodAround(ProceedingJoinPoint joinPoint, MethodLog methodLog) throws Throwable {}
代碼依然正常運行。


既然不用加那個包的限制,這切面還是OK的,為啥還要加呢?

我稍微考慮下,估計是這么個原因:

自定義注解命名的時候,可能你取的名字很大眾化,其他的jar包,也就是你項目引入的jar包,可能有重名的注解,如果要是不加包限制的話,那估計就會出現意想不到的效果。所以,我們就看到,那么多的切面代碼,這地方的寫法都是千篇一律 都是使用 && 符號。限制包,然后限制使用的是哪個注解。

原文:https://blog.csdn.net/qq_27093465/article/details/78804793


免責聲明!

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



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