mybatis动态代理原理初步解析

 为什么我们在调用一个未实现的方法能够执行定义的方法,就是因为mybatis用动态代理给我们实现了。

首先mybatis里面有一个实现InvocationHandler接口的类叫MapperProxy,

类里面有一个方法叫Mapperproxy.invoke();通过Proxy.newProxyInstance创建一个代理实例,

我们在写代码时用sqlSession.getMapper实现。

然后返回我们需要调用方法的接口对象,通过调用MapperProxy.invoke(),

就是invoke()方法执行我们调用的方法。

第二动态代理的时候需要的配置信息从哪里来呢?

其实我们启动项目时候已经加载了配置信息到mybatis总的相关类Configuration中。

如果接口信息和我们的配置信息对应,则能成功执行否则报错。

接口全名称.方法名 == namespace.id,参数与返回值则是通过泛型确定。

 

 

你可能感兴趣的:(java)