定义拦截器

首先便于说明先定义一个简单的拦截器,这个拦截器只打印几行日志

  1. public class SimpleInterceptor implements MethodInterceptor {
  2. public Object invoke(MethodInvocation invocation) throws Throwable {
  3. try {
  4. System.out.println("before... ");
  5. Object returnData = invocation.proceed();
  6. System.out.println("after...");
  7. return returnData;
  8. } catch (Exception e) {
  9. System.out.println("throw...");
  10. throw e;
  11. }
  12. }
  13. }

方法级拦截器

在某个类中只有某些特定的方法需要被拦截,那么就要使用方法级拦截器

  1. public class AopBean {
  2. public String print() {
  3. ...
  4. }
  5. @Aop(SimpleInterceptor.class)
  6. public String echo(String sayMessage) {
  7. return "echo :" + sayMessage;
  8. }
  9. }

类级拦截器

在 Hasor 中为 Bean 配置拦截器只需要一个注解即可,被标注类的所有方法就都被拦截了

  1. @Aop(SimpleInterceptor.class)public class AopBean { public String echo(String sayMessage) { return "echo :" + sayMessage; }}

全局拦截器

全局拦截器实际是 匹配任意类任意方法 的一个拦截器。这种拦截器需要在 Module 中声明

  1. public class MyModule implements Module {
  2. public void loadModule(ApiBinder apiBinder) throws Throwable {
  3. //1.任意类
  4. Matcher<Class<?>> atClass = Matchers.anyClass();
  5. //2.任意方法
  6. Matcher<Method> atMethod = Matchers.anyMethod();
  7. //3.注册拦截器
  8. apiBinder.bindInterceptor(atClass, atMethod, new SimpleInterceptor());
  9. }
  10. }

警告

请不要滥用全局拦截器。

拦截器的匹配器

拦截器的匹配器 net.hasor.core.exts.aop.Matchers

  • 匹配所有类
    • Matchers.anyClass();
  • 匹配所有方法

    • Matchers.anyMethod();
  • 匹配标记了 @MyAop 注解的类

    • Matchers.annotatedWithClass(MyAop.class);
  • 匹配标记了 @MyAop 注解的方法

    • Matchers.annotatedWithMethod(MyAop.class);
  • 匹配 List 类型的子类

    • Matchers.subClassesOf(List.class);
  • 按照通配符匹配类

    • 格式为:<包名>.<类名>

    • 通配符符号为:?表示任意一个字符;*表示任意多个字符。

    • Matchers.expressionClass(“abc.foo.*”);

  • 按照通配符匹配方法

    • 格式为:<返回值> <类名>.<方法名>(<参数签名列表>)

    • 通配符符号为:?表示任意一个字符;*表示任意多个字符。

    • Matchers.expressionMethod(“abc.foo.*”);

通配符匹配方法样例

  1. * * *.*() 匹配:任意无参方法
  2. * * *.*(*) 匹配:任意方法
  3. * * *.add*(*) 匹配:任意add开头的方法
  4. * * *.add*(*,*) 匹配:任意add开头并且具有两个参数的方法。
  5. * * net.test.hasor.*(*) 匹配:包“net.test.hasor”下的任意类,任意方法。
  6. * * net.test.hasor.add*(*) 匹配:包“net.test.hasor”下的任意类,任意add开头的方法。
  7. * java.lang.String *.*(*) 匹配:任意返回值为String类型的方法。