###前言: 一年前就接触了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