3.11 @Pointcut的表示式-target
戴著假髮的程式設計師出品 抖音ID:戴著假髮的程式設計師歡迎關注
[檢視視訊教程]
限制與連線點的匹配,其中目標 object(application object 被代理)是給定型別的例項。
target和this的使用上基本相同,target中配置的也是全限定類名。也有很多程式猿無法分清出target和this的區別,所以在這裡我主要講target和this的不同點。
target和this的主要不同點是:target是按照目標型別進行匹配的。this是按照呼叫型別進行匹配的。
就這一句話可能還是不明白,沒關係,我們看下面的例子:
我們有介面IBookService,其中有方法saveBook。我們有實現類BookServiceImpl實現了介面IBookService介面。
我們作如下配置: 注意我們的全限定類名全部配置為實現類,而不是介面
this:
1 @Pointcut("this(com.st.dk.demo7.service.BookServiceImpl)")
target:
@Pointcut("target(com.st.dk.demo7.service.BookServiceImpl)")
上面的兩種情況下,如果我們按照IBookService介面型別從spring容器中獲取bookService物件,就像下面的程式:
1 @Test 2 public void testAopPointCutTarget(){ 3 ApplicationContext ac = 4new AnnotationConfigApplicationContext(Appconfig.class); 5 IBookService bean = ac.getBean(IBookService.class); 6 bean.saveBook("論一個假髮程式設計師的修養"); 7 }
那麼this的配置就不會對saveBook方法進行攔截和增強,target配置就可以。為什麼呢?
因為this是按照呼叫型別匹配攔截的,我們是按照IBookService介面型別獲取的物件,那麼呼叫型別是IBookService,而我們的配置是BookServiceImpl實現類型別,所以無法匹配。所以如果要匹配就必須配置為介面型別。當然這裡要注意的是,如果代理方式是CGlib,那麼target和this就完全一樣了。
target是按照目標型別進行匹配的,我們的目標型別是實現類BookServiceImpl,所以無論我們配置的IBookService還是BookServiceImpl,我們的目標型別BookServiceImpl中的方法都會被增強和攔截。
不知道看到這裡你是否明白他們的區別,如果還不明白,可以參看視訊講解。