第一章 AOP,第一章aop
關於AOP,通常我們會使用AspectJ註解來做,共有6中切面
- 前置:@Before
- 後置:@After
- 傳回值:@AfterReturing
- 異常:@AfterThrowing
- 環繞:@Around:可以理解為以上四種的集合
- 引用(不常用)
比較難理解的兩個部分:
- 連接點:JoinPoint、ProceedJoinPoint
- 連接點其實就是切面運算式覆蓋的方法,根據該連接點可以擷取多個資訊,常用的如下:
- getSignature():擷取當前方法的傳回值、全類名、參數類型,例:Shop com.xxx.firstboot.dao.ShopDao.getShop(int)
- getTarget():擷取當前方法所屬的類執行個體,例:com.xxx.firstboot.dao.ShopDao@72f97c4f
- getArgs():擷取當前方法的參數,例:[Ljava.lang.Object;@6fbd538a
- JoinPoint習慣性的用在除了@Around中,ProceedJoinPoint習慣性的用在@Around中(因為需要使用ProceedJoinPoint的proceed()方法進行目標方法的執行)
- 切點運算式:
- execution(* com.xxx.firstboot.dao.*.*(..))只需要記住這一個就可以
- 第一個*:代表任意許可權和傳回型別,例:public Shop,如果需要明確指定,就指定
- 第二個*:代表這個包下的所有類,例:ShopDao,如果需要明確指定,就指定
- 第三個*:代表類下的所有方法,例:getShop,如果需要明確指定,就指定
- ..:代表方法的入參類型可以是任意類型、任意數量(包括0個)的,例:int,如果需要明確指定,就指定
- 切點運算式就是方法(連接點)的匹配運算式
兩個補充點:
- 多個切面可以通過@Order(數字)這個註解來制定織入順序,例:@Order(1),數字越小,越先織入,該註解用在切面上(即切面類上)
- 切點運算式可以重用,如下會示範