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 级别的拦截器,以下是 代码示例:
如上代码所示,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(上)的主要内容,如果未能解决你的问题,请参考以下文章