Hasor 攔截器的匹配器

2018-10-06 10:30 更新

前面三個小節(jié)已經(jīng)可以應(yīng)對大部分 Aop 使用場景,那么本小節(jié)就講解一下 Hasor Aop 的高級用法用來應(yīng)對一些及特殊的場景。

我們先以一個小例子作為開始。比如我們需要實(shí)現(xiàn)一個自己的 Service 注解,凡事調(diào)用 Service 時都打印一行日志。

首先聲明自己的注解。

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAop {
}


其次編寫攔截器

public class SimpleInterceptor implements MethodInterceptor {
    public static boolean called = false;
    public Object invoke(MethodInvocation invocation) throws Throwable {
        called = true;
        try {
            System.out.println("before... ");
            Object returnData = invocation.proceed();
            System.out.println("after...");
            return returnData;
        } catch (Exception e) {
            System.out.println("throw...");
            throw e;
        }
    }
}


最后,配置攔截器的篩選器。篩選所有標(biāo)記了 MyAop 注解的 Bean 都使用我們的攔截器,我們在 Module 中進(jìn)行如下聲明:

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



現(xiàn)在引出我們的主角 Matcher 接口,接口的定位是進(jìn)行篩選規(guī)則匹配。無論是篩選類還是篩選方法,都是經(jīng)過該接口。

在上面例子中我們的場景是任意標(biāo)記了 @MyAop 注解的類,假如我們的 aop 有效范圍是,任意標(biāo)記了 @MyAop 的 Controller 呢?

作為一個 Controller 肯定有它的一個特殊標(biāo)記,例如在 Hasor 中 Controller 是一個接口。如果類是一個 Controller 那它一定實(shí)現(xiàn)了這個接口,可以理解為一定是 Controller 的子類。

這時上面的 AopMatchers.anyClass(); 就可以改為 AopMatchers.subClassesOf(Controller.class)。

更多功能您可以參看 AopMatchers 類,如果沒有滿足要求的方法。開發(fā)者還可以自己編寫一個 Matcher 來完成自己的篩選規(guī)則。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號