赞
踩
JDK动态代理的核心由两部分组成:
Java代码
1. public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable
Java代码
Proxy.newProxyInstance(
target.getClass() .getClassLoader(),
target.getClass().getInterfaces(),
new TargetProxy(target)
);
用户在invoke()编写好拦截逻辑后将invocationHandle实例传入动态代理类工厂中获取 代理类
mybatis中,他把拦截目标封装在Invocation类中,将Invocation传入Interceptor类中,在Interceptor中编写拦截逻辑。
Java代码
1. public class Invocation { 2. private Object target; 3. private Method method; 4. private Object[] args; 5. 6. public Invocation(Object target, Method method, Object[] args) { 7. this.target = target; 8. this.method = method; 9. this.args = args; 10. } 11. 12. //将自己成员变量的操作尽量放到自己内部,不需要Interceptor获得自己的成员变量再去操作它们, 13. //除非这样的操作需要Interceptor的其他支持。然而这儿不需要。 14. public Object proceed() throws InvocationTargetException, IllegalAccessException { 15. return method.invoke(target, args); 16. } 17. 18. public Object getTarget() { 19. return target; 20. } 21. public void setTarget(Object target) { 22. this.target = target; 23. } 24. public Method getMethod() { 25. return method; 26. } 27. public void setMethod(Method method) { 28. this.method = method; 29. } 30. public Object[] getArgs() { 31. return args; 32. } 33. public void setArgs(Object[] args) { 34. this.args = args; 35. } 36. }
然后再Interceptor中添加注解,注解需要进行拦截处理的接口。
Java代码
1. @Retention(RetentionPolicy.RUNTIME)
2. @Target(ElementType.TYPE)
3. public @interface MethodName {
4. public String value();
5. }
在拦截器的实现类加上该注解:
Java代码
1. @MethodName("execute1")
2. public class InterceptorImpl implements Interceptor {...}
之后在invocationHandle的invoke()中对拦截器的所有注解进行解析。
Java代码
1. public Object invoke(Object proxy, Method method,
2. Object[] args) throws Throwable {
3. MethodName methodName =
4. this.interceptor.getClass().getAnnotation(MethodName.class);
5. if (ObjectUtils.isNull(methodName))
6. throw new NullPointerException("xxxx");
7.
8. //如果注解上的方法名和该方法名一样,才拦截
9. String name = methodName.value();
10. if (name.equals(method.getName()))
11. return interceptor.intercept(new Invocation(target, method, args));
12.
13. return method.invoke(this.target, args);
14. }
mybatis还有一个有趣的地方就是拦截链,mybatis从XML读取用户拦截器的逻辑并放入拦截链 List
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。