jfinal ——AOP面向切面编程

前言:

一年前就接触了AOP的概念,并且对AOP的三种模式进行了系统的学习,至今还是不能熟练地掌握和运用。今天针对jfinal框架的AOP,重点理解AOP的思想及实现。

这里有篇Thoughtworks大牛之作,他所描述的AOP让我有种新的认知轻松理解AOP思想(面向切面编程)

Jfinal中的AOP

AOP概述

传统AOP实现需要引入大量繁杂而多余的概念,例如:**Aspect、Advice、Joinpoint、Poincut、Introduction、Weaving、Around**等等,并且需要引入IOC容器并配合大量的XML或者annotation来进行组件装配。之前虽然系统学过,但了解地并不深入。如果您也想从传统的方法过渡到现在的jfinal AOP这种切面编程思想,可以了解一下我们框架中[AOP+IOC的方式](http://www.sec119.com/)

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

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

Interceptor

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

public class DemoInterceptor implements Interceptor{
public void intecept(Invocation inv){
System.out.println(“Before method invoking”);
Inv.invoke();
System.out.println(“After method invoking”);
}
}

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

Before

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

1.// 配置一个Class级别的拦截器,她将拦截本类中的所有方法
[email protected](AaaInter.class)
3.public class BlogController extends Controller {
4. 
5.  // 配置多个Method级别的拦截器,仅拦截本方法
6.  @Before({BbbInter.class, CccInter.class})
7.  public void index() {
8.  }
9. 
10.  // 未配置Method级别拦截器,但会被Class级别拦截器AaaInter所拦截
11.  public void show() {
12.  }
13.}

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

除了class和method级别的拦截器意外,Jfinal还支持全局拦截器以及Inject拦截器(Inject拦截将在后面介绍),全局拦截器分为控制器层全局拦截器与业务层全局拦截器,前者拦截控制层所有Action方法,后者拦截业务层所有方法。

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

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

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

拦截器从上到下依次分为Global、Routes、Class、Method四个层次,Clear用于清除自身所处层次以上层的拦截器。

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

在某些应用场景之下,需要移除Global或Class拦截器。例如某个后台管理系统,配置了一个全局的权限拦截器,但是其登录action就必须清除掉她,否则无法完成登录操作,以下是代码示例:

1.// login方法需要移除该权限拦截器才能正常登录
[email protected](AuthInterceptor.class)
3.public class UserController extends Controller {
4.    // AuthInterceptor 已被Clear清除掉,不会被其拦截
5.    @Clear
6.    public void login() {
7.    }
8.    
9.    // 此方法将被AuthInterceptor拦截
10.    public void show() {
11.    }
12.}

Clear注解带有参数时,能清除指定的拦截器,以下是一个更加全面的示例:

[email protected](AAA.class)
2.public class UserController extends Controller {
3.  @Clear
4.  @Before(BBB.class)
5.  public void login() {
6.     // Global、Class级别的拦截器将被清除,但本方法上声明的BBB不受影响
7.  }
8. 
9.  @Clear({AAA.class, CCC.class})// 清除指定的拦截器AAA与CCC
10.  @Before(CCC.class)
11.  public void show() {
12.     // 虽然Clear注解中指定清除CCC,但她无法被清除,因为清除操作只针对于本层以上的各层
13.  }
14.}

参考资料

【1】轻松理解AOP思想(面向切面编程).https://www.cnblogs.com/Wolfmanlq/p/6036019.html#undefined

【2】jifnal官方文档.https://www.jfinal.com/doc/4-3

原文地址:https://www.cnblogs.com/Erma/p/10348081.html

时间: 2024-11-02 02:36:42

jfinal ——AOP面向切面编程的相关文章

Javascript aop(面向切面编程)之around(环绕)

Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被严重忽视的技术点.但是利用aop可以有效的改善js代码逻辑,比如前端框架dojo和yui3中AOP则被提升至自定义事件的一种内在机制,在源码中随处可见.得益于这种抽象使得dojo的自定义事件异常强大和灵活.dojo中aop的实现在dojo/aspect模块中,主要有三个方法:before.after

sprint.net(2) AOP面向切面编程,spring.net的环绕通知;Spring.net的AOP通知的四种类型

AOP 有点类似于我们MVC里面的Filter过滤器,例如在MVC里面,如果给一个Action上打一个标签,就可以在这个Action执行之前或者之后,额外的执行一个方法,这个就相当于是面向切面编程. 无侵入式的. (也就是在不改变原来的代码的情况下,来跳转到一个其他的方法,执行完毕后回到主方法..),但是spring.net的AOP更牛叉,只需要在xml里面配置,就可以了,不需要在方法上面打特性的标签,也不需要继承什么类(例如MVC的过滤器是继承了ActionFilterAttribute) 主

AOP:面向切面编程

AOP:面向切面编程(Aspect-Oriented Programming)      AOP可以说是对OOP的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系.例如日志功能.日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系.在OOP设计中,它导致了大量代码的重复,而不利于各个模块的

深入探索spring技术内幕(七): 配置Spring AOP面向切面编程

一. AOP一些概念 Aspect( 切面 ): 指横切性关注点的抽象即为切面, 它与类相似, 只是两者的关注点不一样, 类是对物体特征的抽象, 而切面横切性关注点的抽象. joinpoint( 连接点 ): 指那些被拦截到的点. 在spring中, 这些点指的是方法, 因为spring只支持方法类型的连接点, 实际上joinpoint还可以是field或类构造器) Pointcut( 切入点 ): 指我们要对那些joinpoint进行拦截的定义. Advice( 通知 ): 指拦截到joinp

spring入门-AOP 面向切面编程

AOP 面向切面编程 在日常开发中最后将业务逻辑定义在一个专门的service包下,而实现定义在service包下的impl包中, 服务接口以IXXXService形式,而服务实现就是XXXService,这就是规约设计 步骤: 1.E:\Users\WorkSpaces\KmwalletApp\spring\aop\test\HelloWorldService.java 继承(implements)xx接口 2.E:\Users\WorkSpaces\KmwalletApp\spring\ao

Aspects– iOS的AOP面向切面编程的库

简介 一个简洁高效的用于使iOS支持AOP面向切面编程的库.它可以帮助你在不改变一个类或类实例的代码的前提下,有效更改类的行为.比iOS传统的 AOP方法,更加简单高效.支持在方法执行的前/后或替代原方法执行.曾经是 PSPDFKit 的一部分,PSPDFKit,在Dropbox和Evernote中都有应用,现在单独单独开源出来给大家使用. 项目主页: Aspects 最新实例:点击下载 注: AOP是一种完全不同于OOP的设计模式.更多信息,可以参考这里: AOP 百度百科 快速入门 环境要求

java aop面向切面编程

最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思.看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果.http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming  面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回

Spring:AOP, 面向切面编程

AOP概述 什么是AOP, 面向切面编程 AOP为Aspect Oriented Programming的缩写, 意为:面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续, 是函数式编程的一种衍生范型. 利用AOP可以对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各部分之间的耦合度降低, 提高程序的可重用性, 同时提高了开发的效率. - 传统开发模型: 纵向的编程.  面向切面编程: 纵横配合的编程. AOP的作用及优势 作用: 在程序运行期

Autofac的AOP面向切面编程研究

*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !important; } .markdown-body a:not([href]) { color: inherit; text-decoration: none; } .markdown-body .anchor { float: left; padding-right: 4px; margin-left: -2