某某茶叶有限公司欢迎您!
金沙棋牌在线 > 操作系统 > JFinal3.0快速上手,极简AOP开发(二十五)

JFinal3.0快速上手,极简AOP开发(二十五)

时间:2020-04-07 10:32

    从 2010 年 12 月 18 日第一个初始版本,到 2012 年 3 月 18 日在 oschina 开源,到今天 2019 年 12 月 18 日,JFinal 已迭代 9 年。

图片 1

本小节主要学习配置全局的拦截器。任务简单,目标明确。

在前一小节我们已经学会了实现简单的AOP操作,那么今天继续来增强一下补充学习如何设置全局的拦截与清除。

    任何系统都有向复杂、混乱方向演化的倾向,本质是由于简洁、有序的结构只拥有极小的概率分布,而复杂、混乱则拥有极大的概率空间。

JFinal视频教程

一、全局配置拦截器,让鱼儿不漏网

全局拦截器主要是简洁、高可用,不需要在每个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方法,输出如下图信息。完美,这就证明控制层全局拦截器已经生效。接着我们一起来验证业务层的拦截器。

图片 2

控制层全局拦截效果

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

图片 3

业务层全局拦截效果

一、讲在前面,理论先行

@Before注解可以用来对拦截器进行配置, @Clear可以清除对拦截器的配置。通过@Before注解可以配置ClassMethod的拦截器。

如你所愿@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();
   }

}

    但是:jfinal 迭代 9 年依然极简、极速。

课程名称:JFinal极速开发企业实战
课程长度:100课时
课程作者:小木(909854136)
课程地址:http://edu.csdn.net/course/detail/1968
官网网址:http://www.xiaomuedu.com
目前国内最新最全内容覆盖面超广,从前端到后端,从核心到细节,从原理到实战,无不细致深入源码讲解,是国内JFianl学习不可多得的素材。

二、山外青山楼外楼

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

图片 4

程序人生

二、精彩验证,请勿走开

我们在控制器中编写了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级别的拦截。

图片 5

index运行结果

4、SayHello方法

SayHello没有在方法上使用拦截器,所以只会执行Class级别的拦截。
@Before(ClassInterceptor.class),这行代码就是告诉jfinal,让它对这个控制器中的action进行拦截。

图片 6

SayHello运行结果

5、SayBye方法

@Clear清除了所有SayBye方法上层的拦截器对SayBye的拦截,所以SayBye不会执行Class级别的拦截。@Clear清除指定的拦截器语法如:@Clear(xxx.class);清除多个和添加一样使用{},进行处理:@Clear({xxx.ass, xxx.class})

图片 7

SayBye运行结果

    jfinal 不忘初心,对极简的追求,9 年从未改变。

课程介绍:
本课程着重深入源码Debug模式讲解JFinal核心架构和运行原理,手把手从零开始带大家开发一个整站,通过本课程的学习可以深入理解WEB开发核心流程,深入理解JFinal核心架构设计原理,熟练使用JFinal开发项目,掌握企业实战技巧
课程目标:
深入理解WEB开发核心及流程 {:&.bounceIn} 深入理解JFinal核心架构设计与原理 熟练使用JFinal开发项目 具备自主开发一个整站的能力 掌握更多企业实战技巧

三、奇思妙想,大胆评测

如果在SayBye方法上添加一个Method的拦截器运行结果,会是怎么样的好奇么?让我们来试一试。

1、改造代码,添加方法级拦截器

   @Clear
   @Before(DemoInterceptor.class)
   public void SayBye(){
       System.out.println("这是一个干净的方法");
       renderNull();
   }

2、运行程序,检查效果

这下可以理解清除上层拦截这个概念了吧?@Clear清除只针对上层的拦截。对于本层和下层的拦截不影响。

图片 8

自带主角光环的SayBye方法

PS:是不是感觉很好玩?那就赶快动起来吧。加油!亲爱的小伙伴们!想加群的朋友可以扫描,加入q群,一起玩转jfinal。

图片 9

程序人生q群