自定义拦截器
拦截器的匹配器
- 类型:
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.*");
通配符匹配方法样例
* *.*() 匹配:任意无参方法
* *.*(*) 匹配:任意方法
* *.add*(*) 匹配:任意add开头的方法
* *.add*(*,*) 匹配:任意add开头并且具有两个参数的方法。
* net.test.hasor.*(*) 匹配:包“net.test.hasor”下的任意类,任意方法。
* net.test.hasor.add*(*) 匹配:包“net.test.hasor”下的任意类,任意add开头的方法。
java.lang.String *.*(*) 匹配:任意返回值为String类型的方法。
自定义Aop注解
首先声明自己的注解。
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAop {
}
其次编写拦截器
public class SimpleInterceptor implements MethodInterceptor {
public static boolean called = false;
public Object invoke(MethodInvocation invocation) throws Throwable {
called = true;
try {
System.out.println("before... ");
Object returnData = invocation.proceed();
System.out.println("after...");
return returnData;
} catch (Exception e) {
System.out.println("throw...");
throw e;
}
}
}
最后,配置拦截器的筛选器。筛选所有标记了 MyAop 注解的 Bean 都使用我们的拦截器,我们在 Module 中进行如下声明:
public class MyAopSetup implements Module {
public void loadModule(ApiBinder apiBinder) throws Throwable {
//1.任意类
Matcher<Class<?>> atClass = AopMatchers.anyClass();
//2.有MyAop注解的方法
Matcher<Method> atMethod = AopMatchers.annotatedWithMethod(MyAop.class);
//3.让@MyAop注解生效
apiBinder.bindInterceptor(atClass, atMethod, new SimpleInterceptor());
}
}