[mybatis] Mapper接口动态代理实现

 

动态代理实现

为什么Mapper接口没有实现类,却能被正常调用呢?

因为MyBatis在Mapper接口上使用了动态代理的一种非常规的用法。

代理类中,当调用一个接口的方法时,会先通过接口的全限定名称和当前调用的方法名的组合得到一个方法id,这个id的值就是映射XML中的namespace和具体方法id的组合。所以可以在代理方法中使用sqlSession以命名空间的方式调用方法。通过这种方式可以将接口和XML文件中的方法关联起来。

这种代理方式和常规代理的不同之处在于,没有对某个具体类进行代理,而是通过代理转化成了对其它代码的调用。