jfinal ——AOP面向切面编程

###前言: 一年前就接触了AOP的概念,而且对AOP的三种模式进行了系统的学习,至今仍是不能熟练地掌握和运用。今天针对jfinal框架的AOP,重点理解AOP的思想及实现。 这里有篇Thoughtworks大牛之做,他所描述的AOP让我有种新的认知轻松理解AOP思想(面向切面编程)html

###Jfinal中的AOP 编程

####AOP概述 传统AOP实现须要引入大量繁杂而多余的概念,例如:Aspect、Advice、Joinpoint、Poincut、Introduction、Weaving、Around等等,而且须要引入IOC容器并配合大量的XML或者annotation来进行组件装配。以前虽然系统学过,但了解地并不深刻。若是您也想从传统的方法过渡到如今的jfinal AOP这种切面编程思想,能够了解一下咱们框架中AOP+IOC的方式     传统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级别的拦截器,她将拦截本类中的全部方法
2.@Before(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方法,后者拦截业务层全部方法。code

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

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就必须清除掉她,不然没法完成登陆操做,如下是代码示例:blog

1.// login方法须要移除该权限拦截器才能正常登陆
2.@Before(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注解带有参数时,能清除指定的拦截器,如下是一个更加全面的示例:接口

1.@Before(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思想(面向切面编程).http://www.javashuo.com/article/p-naxrtyim-dv.html 【2】jifnal官方文档.https://www.jfinal.com/doc/4-3

相关文章
相关标签/搜索