多个环境,每个环境加载相同 Mapper (例如 RowMapper)会导致环境冲突。

创建多个环境,每个环境加载相同 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-26 19:19:00 +08:00 committed by GitHub
parent c969ee388d
commit cc374a6aa2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -28,7 +28,6 @@ import com.mybatisflex.core.util.MapUtil;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -80,7 +79,7 @@ public class Mappers {
* @return {@link BaseMapper} 对象 * @return {@link BaseMapper} 对象
*/ */
public static <M> M ofMapperClass(Class<M> mapperClass) { public static <M> M ofMapperClass(Class<M> mapperClass) {
Map<Class<?>, Object> mapperObjects = MapUtil.computeIfAbsent(MAPPER_OBJECTS_OF_ENV, "default", envId -> new HashMap<>()); Map<Class<?>, Object> mapperObjects = MapUtil.computeIfAbsent(MAPPER_OBJECTS_OF_ENV, "default", envId -> new ConcurrentHashMap<>());
Object mapperObject = MapUtil.computeIfAbsent(mapperObjects, mapperClass, clazz -> Object mapperObject = MapUtil.computeIfAbsent(mapperObjects, mapperClass, clazz ->
Proxy.newProxyInstance(mapperClass.getClassLoader() Proxy.newProxyInstance(mapperClass.getClassLoader()
, new Class[]{mapperClass} , new Class[]{mapperClass}
@ -88,7 +87,7 @@ public class Mappers {
return (M) mapperObject; return (M) mapperObject;
} }
public static <M> M ofMapperClass(String environmentId, Class<M> mapperClass) { public static <M> M ofMapperClass(String environmentId, Class<M> mapperClass) {
Map<Class<?>, Object> mapperObjects = MapUtil.computeIfAbsent(MAPPER_OBJECTS_OF_ENV, environmentId, envId -> new HashMap<>()); Map<Class<?>, Object> mapperObjects = MapUtil.computeIfAbsent(MAPPER_OBJECTS_OF_ENV, environmentId, envId -> new ConcurrentHashMap<>());
Object mapperObject = MapUtil.computeIfAbsent(mapperObjects, mapperClass, clazz -> Object mapperObject = MapUtil.computeIfAbsent(mapperObjects, mapperClass, clazz ->
Proxy.newProxyInstance(mapperClass.getClassLoader() Proxy.newProxyInstance(mapperClass.getClassLoader()
, new Class[]{mapperClass} , new Class[]{mapperClass}