jfinal Aop
JFinal采用极速化的AOP设计,专注AOP最核心的目标,将概念减少到极致,仅有三个概念:Interceptor、Before、Clear,并且无需引入IOC也无需使用啰嗦的XML
Interceptor
创建拦截器
1 实现 jfinal 提供的 Interceptor 接口
public class UserInterceptor implements Interceptor { @Override public void intercept(Invocation inv) { System.out.println("方法之前运行。。。"); //应该执行的目标方法 inv.invoke(); System.out.println("方法之前运行。。。"); } } //----------------------------------------------------- public class UserController extends Controller { @Before(UserInterceptor.class) public void test( ) { System.out.println("业务实现..." ); renderNull(); } } //------------------------------------------------------ //浏览器:http://localhost/user/test //方法之前运行。。。 //业务实现... //方法之前运行。。。
Before
Before注解用来对拦截器进行配置,该注解可配置Class、Method级别的拦截器
@Before(UserInterceptor.class) public class UserController extends Controller { @Before(UserValidator.class) public void save(User user) { user.save( ); redirect("/user"); } }
当某个Method被多个级别的拦截器所拦截,拦截器各级别执行的次序依次为:Global、Routes、Class、Method,如果同级中有多个拦截器,那么同级中的执行次序是:配置在前面的先执行。
Clear
拦截器从上到下依次分为Global、Routes、Class、Method四个层次,Clear用于清除自身所处层次以上层的拦截器
-
一共有Global、Routes、Class、Method 四层拦截器
-
清除只针对Clear本身所处层的向上所有层,本层与下层不清除
-
不带参数时清除所有拦截器,带参时清除参数指定的拦截器
// login方法需要移除该权限拦截器才能正常登录 @Before(AuthInterceptor.class) public class UserController extends Controller { // AuthInterceptor 已被Clear清除掉,不会被其拦截 @Clear public void login() { } // 此方法将被AuthInterceptor拦截 public void show() { } } //--------------------------------------------------------- @Before(AAA.class) public class UserController extends Controller { @Clear @Before(BBB.class) public void login() { // Global、Class级别的拦截器将被清除,但本方法上声明的BBB不受影响 } @Clear({AAA.class, CCC.class})// 清除指定的拦截器AAA与CCC @Before(CCC.class) public void show() { // 虽然Clear注解中指定清除CCC,但她无法被清除,因为清除操作只针对于本层以上的各层 } }
Inject 依赖注入
使用 @Inject 注解可以向 Controller 以及 Interceptor 中注入依赖对象,使用注入功能需要如下配置:
public void configConstant(Constants me) { // 开启对 jfinal web 项目组件 Controller、Interceptor、Validator 的注入 me.setInjectDependency(true); // 开启对超类的注入。不开启时可以在超类中通过 Aop.get(...) 进行注入 me.setInjectSuperClass(true); }
配置好以后
public class AccountController { @Inject AccountService service; // 此处会注入依赖对象 public void index() { service.justDoIt(); // 调用被注入对象的方法 } } // ------------------------------------- public class MyInterceptor implements Interceptor { @Inject Service service; // 此处会注入依赖对象 public void intercept(Invocation inv) { service.justDoIt(); // 调用被注入对象的方法 inv.invoke(); } }
Routes 级别拦截器
/** * 后端路由 */ public class AdminRoutes extends Routes { public void config() { // 此处配置 Routes 级别的拦截器,可配置多个 addInterceptor(new AdminAuthInterceptor()); add("/admin", IndexAdminController.class, "/index"); add("/admin/project", ProjectAdminController.class, "/project"); add("/admin/share", ShareAdminController.class, "/share"); } }
Routes 拦截器在功能上通过一行代码,同时为多个 Controller 配置好相同的拦截器,减少了代码冗余。Routes 级别拦截器将在 Class 级别拦截器之前被调用
本文来自博客园,作者:lanwf,转载请注明原文链接:https://www.cnblogs.com/lccsdncnblogs/p/jfinal_aop.html