/** * Copyright 2009-2015 the original author or authors. * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.baomidou.mybatisplus; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.apache.ibatis.binding.BindingException; import org.apache.ibatis.binding.MapperProxyFactory; import org.apache.ibatis.binding.MapperRegistry; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; import com.baomidou.mybatisplus.entity.GlobalConfiguration; /** * <p> * 继承至MapperRegistry * </p> * * @author Caratacus hubin * @since 2017-04-19 */ public class MybatisMapperRegistry extends MapperRegistry { private final Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap<>(); private final Configuration config; public MybatisMapperRegistry(Configuration config) { super(config); this.config = config; // TODO注入SqlRunner GlobalConfiguration.getSqlInjector(config).injectSqlRunner(config); } @SuppressWarnings("unchecked") public <T> T getMapper(Class<T> type, SqlSession sqlSession) { final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type); if (mapperProxyFactory == null) { throw new BindingException("Type " + type + " is not known to the MybatisPlusMapperRegistry."); } try { return mapperProxyFactory.newInstance(sqlSession); } catch (Exception e) { throw new BindingException("Error getting mapper instance. Cause: " + e, e); } } public <T> boolean hasMapper(Class<T> type) { return knownMappers.containsKey(type); } @Override public <T> void addMapper(Class<T> type) { if (type.isInterface()) { if (hasMapper(type)) { // TODO 如果之前注入 直接返回 return; // throw new BindingException("Type " + type + // " is already known to the MybatisPlusMapperRegistry."); } boolean loadCompleted = false; try { knownMappers.put(type, new MapperProxyFactory<>(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. // TODO 自定义无 XML 注入 MybatisMapperAnnotationBuilder parser = new MybatisMapperAnnotationBuilder(config, type); parser.parse(); loadCompleted = true; } finally { if (!loadCompleted) { knownMappers.remove(type); } } } } /** * @since 3.2.2 */ public Collection<Class<?>> getMappers() { return Collections.unmodifiableCollection(knownMappers.keySet()); } }