本小節(jié)主要學(xué)習(xí)配置全局的攔截器。任務(wù)簡單,目標(biāo)明確。
一、全局配置攔截器,讓魚兒不漏網(wǎng)
全局?jǐn)r截器主要是簡潔、高可用,不需要在每個Class或者 Method上使用@Before手動的去進(jìn)行攔截配置。在JFinal中可以配置全局的控制器層攔截器和業(yè)務(wù)層攔截器,接下來讓我們一起開始一段代碼之旅。
1、配置文件
/**
* 配置全局?jǐn)r截器
*/
public void configInterceptor(Interceptors me) {
//配置全局的控制器攔截器
me.addGlobalActionInterceptor(new ClassInterceptor());
//配置全局的業(yè)務(wù)攔截器
me.addGlobalServiceInterceptor(new GlobalServiceInterceptor());
}
2、編寫GlobalServiceInterceptor攔截器
這是一個簡單的業(yè)務(wù)層攔截器,和以往一樣調(diào)用該方法的時候在控制臺輸出信息。ClassInterceptor和之前的代碼一樣,可以使用之前的。
package com.demo.util;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
public class GlobalServiceInterceptor implements Interceptor {
@Override
public void intercept(Invocation inv) {
System.out.println("這是全局業(yè)務(wù)層的攔截器前置操作~");
inv.invoke();
System.out.println("這是全局業(yè)務(wù)層的攔截器后置操作~");
}
}
3、編寫OrderService業(yè)務(wù)層代碼
這是一個簡單的業(yè)務(wù)層實(shí)現(xiàn),我們會在下來的控制器中調(diào)用該方法。
package com.demo.test;
public class OrderService {
public static final OrderService oc=new OrderService();
/**
* @author sugarYe
* @desc 支付方法
*/
![CK8D~MUSRQ]{J27UUV7X]OU.png](http://upload-images.jianshu.io/upload_images/1176189-33207cf30ab2f000.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
public void Pay(){
System.out.println("你已經(jīng)成功完成了訂單支付!");
}
}
4.鏗鏘有力改造OrderController
在OrderController中,我們?nèi)サ袅?code>@Before(ClassInterceptor.class)代碼,也就是說沒有顯示的為OrderController添加攔截器。增加了pay()方法,演示業(yè)務(wù)層攔截器的使用。
package com.demo.test;
import com.demo.util.DemoInterceptor;
import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.core.Controller;
public class OrderController extends Controller {
@Before(DemoInterceptor.class)
public void index(){
System.out.println("開始執(zhí)行index方法,我是目標(biāo)執(zhí)行方法。");
render("test.html");
}
public void SayHello(){
System.out.println("這是一個沒有添加方法級的攔截的SayHello方法");
renderNull();
}
@Clear
@Before(DemoInterceptor.class)
public void SayBye(){
System.out.println("這是一個干凈的方法");
renderNull();
}
/**
* 支付方法
*/
public void pay(){
//使用enhance方法增強(qiáng)業(yè)務(wù)層
OrderService service = enhance(OrderService.class);
//調(diào)用支付方法
service.Pay();
renderNull();
}
}
5、驗(yàn)證猜想與現(xiàn)實(shí)
首先啟動project,然后測試index方法,輸出如下圖信息。完美,這就證明控制層全局?jǐn)r截器已經(jīng)生效。接著我們一起來驗(yàn)證業(yè)務(wù)層的攔截器。

完美,業(yè)務(wù)層的全局?jǐn)r截器也已經(jīng)生效。

二、山外青山樓外樓
業(yè)務(wù)攔截是不是只有上述的方法呢?當(dāng)然不是,其實(shí)我們還可以使用Duang類和Enhancer 類,它們可以對任意目標(biāo)在任何地方增強(qiáng),使其擁有AOP的能力。
1、參悟代碼
/**
* 支付方法
*/
public void pay(){
//使用enhance方法增強(qiáng)業(yè)務(wù)層,第一種實(shí)現(xiàn)方式
//OrderService service = enhance(OrderService.class);
//第二種實(shí)現(xiàn)方式,Duang類
//OrderService service=Duang.duang(OrderService.class);
//第三種實(shí)現(xiàn),使用Enhancer類;這和第一種其實(shí)是一回事
OrderService service=Enhancer.enhance(OrderService.class,Tx.class);
//調(diào)用支付方法
service.Pay();
//返回null
renderNull();
}
2、這么做有什么意思?
在寫swift的時候,有一點(diǎn)比較好的就是如果使用的原生類不夠強(qiáng)大,開發(fā)者可以使用關(guān)鍵字去擴(kuò)展屬于自己的方法。在jfinal中其實(shí)我們可以使用 Enhancer.enhance()或 Duang.duang()來增強(qiáng)目標(biāo)類或者目標(biāo)方法。對于jar包不能使用常規(guī)的注解的時候,可以使用Inject 攔截器來增強(qiáng)。也就是前面所講的第三種實(shí)現(xiàn)方式。
PS:對于路由級別的攔截器,小伙伴們就請自由發(fā)揮吧。這里就不贅述了。