W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
前面三個(gè)小節(jié)已經(jīng)可以應(yīng)對(duì)大部分 Aop 使用場(chǎng)景,那么本小節(jié)就講解一下 Hasor Aop 的高級(jí)用法用來(lái)應(yīng)對(duì)一些及特殊的場(chǎng)景。
我們先以一個(gè)小例子作為開(kāi)始。比如我們需要實(shí)現(xiàn)一個(gè)自己的 Service 注解,凡事調(diào)用 Service 時(shí)都打印一行日志。
首先聲明自己的注解。
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAop {
}
其次編寫(xiě)攔截器
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 都使用我們的攔截器,我們?cè)?Module 中進(jìn)行如下聲明:
public class MyAopSetup implements Module {
public void loadModule(ApiBinder apiBinder) throws Throwable {
//1.任意類(lèi)
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ī)則匹配。無(wú)論是篩選類(lèi)還是篩選方法,都是經(jīng)過(guò)該接口。
在上面例子中我們的場(chǎng)景是任意標(biāo)記了 @MyAop 注解的類(lèi),假如我們的 aop 有效范圍是,任意標(biāo)記了 @MyAop 的 Controller 呢?
作為一個(gè) Controller 肯定有它的一個(gè)特殊標(biāo)記,例如在 Hasor 中 Controller 是一個(gè)接口。如果類(lèi)是一個(gè) Controller 那它一定實(shí)現(xiàn)了這個(gè)接口,可以理解為一定是 Controller 的子類(lèi)。
這時(shí)上面的 AopMatchers.anyClass();
就可以改為 AopMatchers.subClassesOf(Controller.class)
。
更多功能您可以參看 AopMatchers
類(lèi),如果沒(méi)有滿(mǎn)足要求的方法。開(kāi)發(fā)者還可以自己編寫(xiě)一個(gè) Matcher 來(lái)完成自己的篩選規(guī)則。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: