本小節主要學習配置全局的攔截器。任務簡單,目標明確。
一、全局配置攔截器,讓魚兒不漏網
全局攔截器主要是簡潔、高可用,不需要在每個Class或者 Method上使用@Before手動的去進行攔截配置。在JFinal中可以配置全局的控制器層攔截器和業務層攔截器,接下來讓我們一起開始一段代碼之旅。
1、配置文件
/**
* 配置全局攔截器
*/
public void configInterceptor(Interceptors me) {
//配置全局的控制器攔截器
me.addGlobalActionInterceptor(new ClassInterceptor());
//配置全局的業務攔截器
me.addGlobalServiceInterceptor(new GlobalServiceInterceptor());
}
2、編寫GlobalServiceInterceptor攔截器
這是一個簡單的業務層攔截器,和以往一樣調用該方法的時候在控制臺輸出信息。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("這是全局業務層的攔截器前置操作~");
inv.invoke();
System.out.println("這是全局業務層的攔截器后置操作~");
}
}
3、編寫OrderService業務層代碼
這是一個簡單的業務層實現,我們會在下來的控制器中調用該方法。
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("你已經成功完成了訂單支付!");
}
}
4.鏗鏘有力改造OrderController
在OrderController中,我們去掉了
@Before(ClassInterceptor.class)
代碼,也就是說沒有顯示的為OrderController添加攔截器。增加了pay()方法,演示業務層攔截器的使用。
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("開始執行index方法,我是目標執行方法。");
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方法增強業務層
OrderService service = enhance(OrderService.class);
//調用支付方法
service.Pay();
renderNull();
}
}
5、驗證猜想與現實
首先啟動project,然后測試index方法,輸出如下圖信息。完美,這就證明控制層全局攔截器已經生效。接著我們一起來驗證業務層的攔截器。
完美,業務層的全局攔截器也已經生效。
二、山外青山樓外樓
業務攔截是不是只有上述的方法呢?當然不是,其實我們還可以使用Duang類和Enhancer 類,它們可以對任意目標在任何地方增強,使其擁有AOP的能力。
1、參悟代碼
/**
* 支付方法
*/
public void pay(){
//使用enhance方法增強業務層,第一種實現方式
//OrderService service = enhance(OrderService.class);
//第二種實現方式,Duang類
//OrderService service=Duang.duang(OrderService.class);
//第三種實現,使用Enhancer類;這和第一種其實是一回事
OrderService service=Enhancer.enhance(OrderService.class,Tx.class);
//調用支付方法
service.Pay();
//返回null
renderNull();
}
2、這么做有什么意思?
在寫swift的時候,有一點比較好的就是如果使用的原生類不夠強大,開發者可以使用關鍵字去擴展屬于自己的方法。在jfinal中其實我們可以使用 Enhancer.enhance()或 Duang.duang()來增強目標類或者目標方法。對于jar包不能使用常規的注解的時候,可以使用Inject 攔截器來增強。也就是前面所講的第三種實現方式。
PS:對于路由級別的攔截器,小伙伴們就請自由發揮吧。這里就不贅述了。