mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-06 16:48:24 +08:00
多环境导入相同 Mapper 冲突问题
创建多个环境,每个环境加载相同 Mapper (例如 RowMapper)会导致环境冲突。 代码: // 环境实例1 MybatisFlexBootstrap client1 = ...; client1.addMapper(RowMapper.class); // 环境实例2: MybatisFlexBootstrap client2 = // ; client2.addMapper(RowMapper.class); client1.getMapper(RowMapper.class); // client2 拿到的永远都是 client1 的 RowMapper client2.getMapper(RowMapper.class);
This commit is contained in:
parent
82ed8229e2
commit
c969ee388d
@ -28,6 +28,7 @@ import com.mybatisflex.core.util.MapUtil;
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@ -43,7 +44,7 @@ public class Mappers {
|
||||
private Mappers() {
|
||||
}
|
||||
|
||||
private static final Map<Class<?>, Object> MAPPER_OBJECTS = new ConcurrentHashMap<>();
|
||||
private static final Map<String, Map<Class<?>, Object>> MAPPER_OBJECTS_OF_ENV = new ConcurrentHashMap<>();
|
||||
|
||||
private static final Map<Class<?>, Class<?>> ENTITY_MAPPER_MAP = new ConcurrentHashMap<>();
|
||||
|
||||
@ -79,14 +80,16 @@ public class Mappers {
|
||||
* @return {@link BaseMapper} 对象
|
||||
*/
|
||||
public static <M> M ofMapperClass(Class<M> mapperClass) {
|
||||
Object mapperObject = MapUtil.computeIfAbsent(MAPPER_OBJECTS, mapperClass, clazz ->
|
||||
Map<Class<?>, Object> mapperObjects = MapUtil.computeIfAbsent(MAPPER_OBJECTS_OF_ENV, "default", envId -> new HashMap<>());
|
||||
Object mapperObject = MapUtil.computeIfAbsent(mapperObjects, mapperClass, clazz ->
|
||||
Proxy.newProxyInstance(mapperClass.getClassLoader()
|
||||
, new Class[]{mapperClass}
|
||||
, new MapperHandler(mapperClass)));
|
||||
return (M) mapperObject;
|
||||
}
|
||||
public static <M> M ofMapperClass(String environmentId, Class<M> mapperClass) {
|
||||
Object mapperObject = MapUtil.computeIfAbsent(MAPPER_OBJECTS, mapperClass, clazz ->
|
||||
Map<Class<?>, Object> mapperObjects = MapUtil.computeIfAbsent(MAPPER_OBJECTS_OF_ENV, environmentId, envId -> new HashMap<>());
|
||||
Object mapperObject = MapUtil.computeIfAbsent(mapperObjects, mapperClass, clazz ->
|
||||
Proxy.newProxyInstance(mapperClass.getClassLoader()
|
||||
, new Class[]{mapperClass}
|
||||
, new MapperHandler(environmentId, mapperClass)));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user