jfinal(6)—Aop

1.Aop概述

JFinal采用极速化的AOP设计,专注AOP最核心的目标,将概念减少到极致,仅有三个概念:Interceptor、Before、Clear,并且无需引入IOC也无需使用啰嗦的XML。

2.Interceptor拦截器

定义和配置拦截器

定义拦截器类:创建一个类实现Interceptor接口

配置一个拦截器:@Before(定义的拦截器类.class)

配置多个拦截器:@Before({MyInterceptor.class, DemoInterceptor.class})

拦截器的拦截级别

拦截器从上到下依次分为Global、Routes、Class、Method四个层次,不同层级有不同的作用范围、配置方式

1、全局拦截器:全局拦截器分为控制层全局拦截器与业务层全局拦截器,前者拦截控制层所有 Action方法,后者拦截业务层所有方法。全局拦截器需要在 YourJFinalConfig 进行配置

2.Routes路由拦截器:路由级拦截器拦截当前路由中配置的所有Controller中的所有 Action 方法,属于控制 层拦截器,在Route中配置,

3.Class类级拦截器:

4.Method方法及拦截器:

拦截器分类

拦截器根据应用场景不同拦截器可以分为两类,控制层拦截器和业务层拦截器。虽然是可以根据应用场景不同分为两类,但是在使用上几乎没有差别,主要是应用场景不同。

控制层拦截器:拦截控制层 Action 方法,上一节演示的都是控制层拦截器;
业务层拦截器:拦截业务层方法,业务层对象是需要JFinal接管的,否则不会生效;jfinal插创建的才有效,可以用注入的方式

拦截器执行顺序

当某个Method被多个级别的拦截器所拦截,拦截器各级别执行的次序依次为:
Global、Routes、Class、Method,如果同级中有多个拦截器,那么同级中的执行次序 是:配置在前面的先执行(针对前切面)。

清除拦截器

当明确不需要某个或者某几个拦截器时,可以使用Clear注解清除自身所处层次以上层 的拦截器

Clear声明在Method层时将针对Global、Routes、Class进行清除。Clear声明在Class层时将针对Global、Routes 进行清除。Clear注解不带参数时清除所有拦截器,携带参数 时清除目标层中指定的拦截器。

3.Validator

概述

Validator是JFinal校验组件,在Validator类中提供了非常方便的校验方法,可用于表单校验、接口校验等场景。功能强大,使用频率高,官方手册单独设置了一个章节介绍,这里为什么放大AOP章节了,因为它也是一个Interceptor,是一个特殊的Interceptor。知道Validator也是一个Interceptor后,我们就掌握了一半的使用方法了。

定义和配置

定义校验类:创建一个类实现Validator接口

配置:@Before(定义的拦截器类.class)

在这里插入图片描述
调用后台业务方法进行验证,配合一个 addError(…) 方法就可以无限制、灵活定制验证功能。
在这里插入图片描述

4.依赖注入

启用依赖注入配置

使用 @Inject 注解可以向 Controller 以及 Interceptor 中注入依赖对象,使用注入功能需要如下配置,一个是启用依赖注入,一个是开启超类注入(可选),这两个配置都是Config类的常量配置中设置的。

public void configConstant(Constants me) {
    
    
    // 开启对 jfinal web 项目组件 Controller、Interceptor、Validator 的注入
    me.setInjectDependency(true);
   
    // 开启对超类的注入。不开启时可以在超类中通过 Aop.get(...) 进行注入
    me.setInjectSuperClass(true);
}

jfinal web 项目组件:Controller、Interceptor、Validator;
超类的注入:被注入的类的父类中的使用了@Inject的属性也进行依赖注入;

注意:使用 Inject 注入的前提是使用 @Inject 注解的类的对象的创建是由 jfinal 接管的,这样 jfinal才有机会对其进行注入。例如 Controller、Interceptor、Validator 的创建是 jfinal 接管的,所以这三种组件中可以使用 @Inject 注入。

猜你喜欢

转载自blog.csdn.net/qq_45928727/article/details/108898211