当前位置:   article > 正文

#读mybatis注解有感#_mybatis invocation

mybatis invocation

mybatis注解有感


JDK动态代理的核心由两部分组成:

  • invocationHandle 包含了代理接口

Java代码

1. public Object invoke(Object proxy, Method method,  
                          Object[] args) throws Throwable  
  • 1
  • 2
  • 动态代理类工厂 Proxy.newProxyInstance()

Java代码

 Proxy.newProxyInstance(  
     target.getClass() .getClassLoader(),  
     target.getClass().getInterfaces(),  
    new TargetProxy(target)
); 
  • 1
  • 2
  • 3
  • 4
  • 5

用户在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. }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

然后再Interceptor中添加注解,注解需要进行拦截处理的接口。

Java代码

1. @Retention(RetentionPolicy.RUNTIME)  
2. @Target(ElementType.TYPE)  
3. public @interface MethodName {  
4.     public String value();  
5. }  
  • 1
  • 2
  • 3
  • 4
  • 5

在拦截器的实现类加上该注解:
Java代码

1. @MethodName("execute1")  
2. public class InterceptorImpl implements Interceptor {...}  
  • 1
  • 2

之后在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. }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

mybatis还有一个有趣的地方就是拦截链,mybatis从XML读取用户拦截器的逻辑并放入拦截链 List

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/921992
推荐阅读
相关标签
  

闽ICP备14008679号