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 级别拦截器之前被调用

posted @ 2020-03-17 15:00  lanwf  阅读(461)  评论(0编辑  收藏  举报