JFinal3.0快速上手,极简AOP开发(二十五)
本小节主要学习配置全局的拦截器。任务简单,目标明确。
一、全局配置拦截器,让鱼儿不漏网
全局拦截器主要是简洁、高可用,不需要在每个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:https://img.haomeiwen.com/i1176189/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:对于路由级别的拦截器,小伙伴们就请自由发挥吧。这里就不赘述了。想一起嗨翻jfinal极速开发的小伙伴可以扫面下方二维码,进群一起玩!