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://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方法,输出如下图信息。完美,这就证明控制层全局拦截器已经生效。接着我们一起来验证业务层的拦截器。

JFinal3.0快速上手,极简AOP开发(二十五)_第1张图片
控制层全局拦截效果

完美,业务层的全局拦截器也已经生效。

JFinal3.0快速上手,极简AOP开发(二十五)_第2张图片
业务层全局拦截效果

二、山外青山楼外楼

业务拦截是不是只有上述的方法呢?当然不是,其实我们还可以使用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极速开发的小伙伴可以扫面下方二维码,进群一起玩!

JFinal3.0快速上手,极简AOP开发(二十五)_第3张图片
程序人生

你可能感兴趣的:(JFinal3.0快速上手,极简AOP开发(二十五))