在前一小節我們已經學會了實現簡單的AOP操作,那么今天繼續來增強一下補充學習如何設置全局的攔截與清除。
一、講在前面,理論先行
@Before注解可以用來對攔截器進行配置, @Clear可以清除對攔截器的配置。通過@Before注解可以配置Class、 Method的攔截器。
如你所愿@Before可以同時配置多個攔截器,語法:
@Before({xxx.class,xxx.class})
,其實很簡單就是在注解中使用{}
分別配置要使用到的攔截器。示例如下:
package com.demo.test;
import com.demo.util.ClassInterceptor;
import com.demo.util.DemoInterceptor;
import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.core.Controller;
@Before(ClassInterceptor.class)
public class OrderController extends Controller {
@Before(DemoInterceptor.class)
public void index(){
System.out.println("開始執行index方法,我是目標執行方法。");
render("test.html");
}
public void SayHello(){
System.out.println("這是一個沒有添加方法級的攔截的SayHello方法");
renderNull();
}
@Clear
public void SayBye(){
System.out.println("這是一個干凈的方法");
renderNull();
}
}
二、精彩驗證,請勿走開
我們在控制器中編寫了index()、SayHello()、SayBye()方法,你能根據上述的理論,猜到程序運行的結果么?先思考一下。
這邊提供一下DemoInterceptor和ClassInterceptor的實現代碼,分別如下:
1、DemoInterceptor實現
package com.demo.util;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
public class DemoInterceptor implements Interceptor {
@Override
public void intercept(Invocation inv) {
System.out.println("Before method invoking");
inv.invoke();
System.out.println("After methon invoking");
}
}
2、ClassInterceptor實現
package com.demo.util;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
public class ClassInterceptor implements Interceptor{
@Override
public void intercept(Invocation inv) {
System.out.println("這是類級別攔截的前置執行效果");
inv.invoke();
System.out.println("這是類級別攔截的后置執行效果");
}
}
在兩個攔截器中,程序都只是向控制臺輸出打印了一段文字,你也許猜想到了執行效果,接下來就讓我們一起來驗證。
3、index方法
對index方法的攔截是比較有趣的,可以看出來攔截器是有執行順序(優先級)的。在沒有全局攔截器的情況下,先執行的是Class級別的攔截器,接著執行的是Method的級別的攔截器,最終執行的是目標方法。如果存在后置執行的方法則反之。這就像Java中的換括號表示作用域一樣,最外層的包裹的作用域自然越大。index方法執行了本身的攔截,還執行了Class級別的攔截。
4、SayHello方法
SayHello沒有在方法上使用攔截器,所以只會執行Class級別的攔截。
@Before(ClassInterceptor.class),這行代碼就是告訴jfinal,讓它對這個控制器中的action進行攔截。
5、SayBye方法
@Clear清除了所有SayBye方法上層的攔截器對SayBye的攔截,所以SayBye不會執行Class級別的攔截。@Clear清除指定的攔截器語法如:
@Clear(xxx.class)
;清除多個和添加一樣使用{}
和,
進行處理:@Clear({xxx.ass, xxx.class})
。
三、奇思妙想,大膽評測
如果在SayBye方法上添加一個Method的攔截器運行結果,會是怎么樣的好奇么?讓我們來試一試。
1、改造代碼,添加方法級攔截器
@Clear
@Before(DemoInterceptor.class)
public void SayBye(){
System.out.println("這是一個干凈的方法");
renderNull();
}
2、運行程序,檢查效果
這下可以理解清除上層攔截這個概念了吧?@Clear清除只針對上層的攔截。對于本層和下層的攔截不影響。
PS:是不是感覺很好玩?那就趕快動起來吧。加油!親愛的小伙伴們!