Hasor 攔截器級別

2018-10-06 10:30 更新

前面章節(jié)我們看到了使用 Hasor 進行 Aop 開發(fā)的一個簡單例子。Hasor 提供的 @Aop 注解不光可以標記到類上,它還可以標記在方法上。


A.類級攔截器


如果 @Aop 標記到類上,那么 Aop 攔截器將會對整個類的 public、protected 方法生效,這叫做類級攔截器。

類級攔截器的例子這里展示一下它的特征代碼:

@Aop(SimpleInterceptor.class)
public class AopBean {
    public String echo(String sayMessage) {
        return "echo :" + sayMessage;
    }
}


B.方法級攔截器


有時候我們不想攔截所有方法,只想對有限的幾個方法做 Aop 攔截。這個時候就會用到 Hasor 的方法級攔截器,還是以上面的 AopBean 為例,假設我們有兩個方法。我們只想攔截 echo 方法調用,那么可以這樣:

public class AopBean {
    public String print() {
        ...
    }
    @Aop(SimpleInterceptor.class)
    public String echo(String sayMessage) {
        return "echo :" + sayMessage;
    }
}


我們可以看出,方法級攔截器和類級攔截器的唯一區(qū)別就是 @Aop 注解放到方法上而不是類上。

沒錯就這么簡單。


C.全局攔截器


假定我們希望在產品開發(fā)完畢之后,想檢測一下方法的覆蓋率。最簡單的一種方式就是開發(fā)一些全局 Aop 每當方法調用時將方法名記錄下來。這樣經過一段時間運行之后只要沒有調用過的方法都可能是無用的方法。或者還沒有觸發(fā)相關業(yè)務場景。接下來我們來講解一下如何在 Hasor 中聲明一個全局攔截器。

首先全局攔截器是一種比較重量級的攔截器,它相當于為所有類都做了一層 Aop。如果沒有控制好性能,很容易因為全局攔截器拖垮整個應用的性能。

因此為了安全起見,Hasor 并沒有提供任何注解方式聲明全局 Aop 的途徑。如果您想使用全局攔截器就要在 Module 中自己進行特別聲明,例如如下代碼就是將 SimpleInterceptor 作為全局攔截器進行聲明。

public class MyModule implements Module {
    public void loadModule(ApiBinder apiBinder) throws Throwable {
        //1.任意類
        Matcher<Class<?>> atClass = AopMatchers.anyClass();
        //2.任意方法
        Matcher<Method> atMethod = AopMatchers.anyMethod();
        //3.注冊攔截器讓@MyAop注解生效
        apiBinder.bindInterceptor(atClass, atMethod, new SimpleInterceptor());
    }
}


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號