JFinal教程:AOP(上)

Posted JAVA的学习之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JFinal教程:AOP(上)相关的知识,希望对你有一定的参考价值。

概述


    传统 AOP 实现需要引入大量繁杂而多余的概念,例如:Aspect、Advice、Joinpoint、Poincut、 Introduction、Weaving、Around 等等,并且需要引入 IOC 容器并配合大量的 XML 或者 annotation 来进行组件装配。

   传统 AOP 不但学习成本极高,开发效率极低,开发体验极差,而且还影响系统性能,尤 其是在开发阶段造成项目启动缓慢,极大影响开发效率。

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


Interceptor

   Interceptor 可以对方法进行拦截,并提供机会在方法的前后添加切面代码,实现 AOP 的 核心目标。Interceptor 接口仅仅定了一个方法 void intercept(Invocation inv)。以下是简单的示例:


public class DemoInterceptor implements Interceptor {
	public void intercept(Invocation inv) { System.out.println("Before method invoking"); inv.invoke();
	System.out.println("After method invoking");
	}
}


    以上代码中的 DemoInterceptor 将拦截目标方法,并且在目标方法调用前后向控制台输出 文本。inv.invoke()这一行代码是对目标方法的调用,在这一行代码的前后插入切面代码可以很 方便地实现 AOP。

   nvocation 作为 Interceptor 接口 intercept 方法中的唯一参数,提供了很多便利的方法在拦 截器中使用。以下为 Invocation 中的方法:

方法

描述

void invoke()

传递本次调用,调用剩下的拦截器与目标方法

Controller getController()

获取 Action 调用的 Controller 对象(仅用于控制层拦截)

String getActionKey()

获取 Action 调用的 action key 值(仅用于控制层拦截)

String getControllerKey()

获取 Action 调用的 controller key 值(仅用于控制层拦截)

String getViewPath()

获取 Action 调用的视图路径(仅用于控制层拦截)

<T> T getTarget()

获取被拦截方法所属的对象

Method getMethod()

获取被拦截方法的 Method 对象

String getMethodName()

获取被拦截方法的方法名

Object[] getArgs()

获取被拦截方法的所有参数值

Object getArg(int)

获取被拦截方法指定序号的参数值

<T> T getReturnValue()

获取被拦截方法的返回值

void setArg(int)

设置被拦截方法指定序号的参数值

void setReturnValue(Object)

设置被拦截方法的返回值

boolean isActionInvocation()

判断是否为 Action 调用,也即是否为控制层拦截


Before

Before 注解用来对拦截器进行配置,该注解可配置 Class、Method 级别的拦截器,以下是 代码示例:

JFinal教程(九):AOP(上)


如上代码所示,Before 可以将拦截器配置为 Class 级别与 Method 级别,前者将拦截本类 中所有方法,后者仅拦截本方法。此外 Before 可以同时配置多个拦截器,只需用在大括号内 用逗号将多个拦截器进行分隔即可。

除了 Class 与 Method 级别的拦截器以外,JFinal 还支持全局拦截器以及 Inject 拦截器(Inject

拦截将在后面介绍),全局拦截器分为控制层全局拦截器与业务层全局拦截器,前者拦截控制 层所有 Action 方法,后者拦截业务层所有方法。

全局拦截器需要在 YourJFinalConfig 进行配置,以下是配置示例:


public class AppConfig extends JFinalConfig {
	public void configInterceptor(Interceptors me) {
	// 添加控制层全局拦截器
	me.addGlobalActionInterceptor(new GlobalActionInterceptor());
 
	// 添加业务层全局拦截器
	me.addGlobalServiceInterceptor(new GlobalServiceInterceptor());
 
	// 为兼容老版本保留的方法,功能与addGlobalActionInterceptor完全一样
	me.add(new GlobalActionInterceptor());
	}
}

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



- THE END -



作者简介

Mr.W

白天搬砖,晚上砌梦想。

相信每个人有故事,程序员更是有许多事故,书写最接地气的程序员故事,为大家找出更好的资料。



以上是关于JFinal教程:AOP(上)的主要内容,如果未能解决你的问题,请参考以下文章

jfinal ——AOP面向切面编程

JFinal视频教程

jfinal框架教程-学习笔记

jfinal 项目 控制层ORM层AOP层,在发表之前一定要记得保存

JFinal教程

jfinal框架教程