多环境导入相同 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:
wcc1433 2025-05-25 15:40:10 +08:00 committed by GitHub
parent 82ed8229e2
commit c969ee388d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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)));