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 注入。