衆所周知,接口是不能被執行個體化的,但是日常開發中,我們經常能直接使用dao層對象的方法,這又是為什麼呢。
帶着這些問題,我們看下mybatis内部做了那些操作。
Mapper解析
上文我們描述了mybatis會解析xml配置檔案,将xml各個節點解析到Configuration中,其中的映射器解析就是解析xml中每條sql

看下映射器的解析
再看看bindMapperForNamespace,将namespace即dao接口反射成一個class
addMapper方法裡我們看到了mapperRegisty,這是映射器注冊機
MapperProxyFactory映射器代理工廠,用于生産代理類。
以上過程都發生在mapper解析中,mybatis隻是将各個接口存到一個mapper,還沒有做出代理。接下來我們看下具體調用dao層接口時的操作
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
OrderMapper OrderMapper = sqlSession.getMapper(OrderMapper.class);
List<Order> ordertList = OrderMapper.selectProductList();
for (Order order : ordertList) {
System.out.printf(order.toString());
}
} finally {
sqlSession.close();
}
最終還是到了mapperRegisty
JDK動态代理生産代理類
MapperProxy,每一次的方法調用都會到invoke中去