码迷,mamicode.com
首页 > 编程语言 > 详细

MyBatis整合Spring的实现(17)

时间:2015-10-30 10:57:41      阅读:401      评论:0      收藏:0      [点我收藏+]

标签:

这里也只使用一个例子来分析

1 方法bindMapperForNamespace

private void bindMapperForNamespace() {
    // cn.vansky.schedule.time.menu.dao.MenuMapper
    String namespace = builderAssistant.getCurrentNamespace();
    if (namespace != null) {
      Class<?> boundType = null;
      try {
        // 根据命名空间来查询相应的接口
        // interface cn.vansky.schedule.time.menu.dao.MenuMapper
        boundType = Resources.classForName(namespace);
      } catch (ClassNotFoundException e) {
        //ignore, bound type is not required
      }
      if (boundType != null) {
        if (!configuration.hasMapper(boundType)) {
          // Spring may not know the real resource name so we set a flag
          // to prevent loading again this resource from the mapper interface
          // look at MapperAnnotationBuilder#loadXmlResource
          // 加载过的资源添加到Configuration(全局配置类)里
          // 属性为Set<String> loadedResources = new HashSet<String>()
          configuration.addLoadedResource("namespace:" + namespace);
          // 加载的Mapper添加到Configuration(全局配置类)里
          // 属性为MapperRegistry mapperRegistry = new MapperRegistry(this)
          configuration.addMapper(boundType);
        }
      }
    }
}

上面把加载过的资源文件与加载过的SQLMapper文件放入到Configuration(全局配置类)中。

MyBatis也支持注解方式,那么注释是怎么注入的呢?这个代码就在addMapper方法里面,就来看看相应的代码。

public <T> void addMapper(Class<T> type) {
    if (type.isInterface()) {
      if (hasMapper(type)) {
        throw new BindingException("Type " + type + " is already known to the MapperRegistry.");
      }
      boolean loadCompleted = false;
      try {
        knownMappers.put(type, new MapperProxyFactory<T>(type));
        // It‘s important that the type is added before the parser is run
        // otherwise the binding may automatically be attempted by the
        // mapper parser. If the type is already known, it won‘t try.
        MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);
        // 注解的解析
        parser.parse();
        loadCompleted = true;
      } finally {
        if (!loadCompleted) {
          knownMappers.remove(type);
        }
      }
    }
}

这里不在对注解方式进行分析,有兴趣的童鞋,可以自行分析一下。

技术分享

上图就是Configuration(全局配置类)中添加Mapper的位置及相应的属性。

MyBatis整合Spring的实现(17)

标签:

原文地址:http://my.oschina.net/u/1269959/blog/523862

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!