diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/BatchLoaderContextProviderFactory.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/BatchLoaderContextProviderFactory.java
new file mode 100644
index 00000000..8696ccc6
--- /dev/null
+++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/BatchLoaderContextProviderFactory.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2002-2024 the original author or authors.
+ *
+ * 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
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.springframework.graphql.execution;
+
+import org.dataloader.BatchLoaderContextProvider;
+
+import graphql.GraphQLContext;
+
+/**
+ * Contract to create a {@link BatchLoaderContextProvider} for a given
+ * {@link GraphQLContext}.
+ */
+public interface BatchLoaderContextProviderFactory {
+
+ /**
+ * Create a new {@link BatchLoaderContextProvider} for the given
+ * {@link GraphQLContext}.
+ */
+ BatchLoaderContextProvider create(GraphQLContext context);
+}
diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/BatchLoaderRegistry.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/BatchLoaderRegistry.java
index 2c92f4aa..b3b20749 100644
--- a/spring-graphql/src/main/java/org/springframework/graphql/execution/BatchLoaderRegistry.java
+++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/BatchLoaderRegistry.java
@@ -21,10 +21,16 @@
import java.util.function.BiFunction;
import java.util.function.Consumer;
-import graphql.ExecutionInput;
+import org.dataloader.BatchLoader;
import org.dataloader.BatchLoaderContextProvider;
import org.dataloader.BatchLoaderEnvironment;
+import org.dataloader.BatchLoaderWithContext;
import org.dataloader.DataLoaderOptions;
+import org.dataloader.MappedBatchLoader;
+import org.dataloader.MappedBatchLoaderWithContext;
+import org.springframework.util.Assert;
+
+import graphql.ExecutionInput;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -52,7 +58,7 @@ public interface BatchLoaderRegistry extends DataLoaderRegistrar {
*
When this method is used, the name for the
* {@link org.dataloader.DataLoader} is automatically set as defined in
* {@link RegistrationSpec#withName(String)}, and likewise,
- * {@code @SchemaMapping} handler methods can transparenly locate and
+ * {@code @SchemaMapping} handler methods can transparently locate and
* inject a {@code DataLoader} argument based on the generic type
* {@code }.
*
@@ -79,6 +85,343 @@ public interface BatchLoaderRegistry extends DataLoaderRegistrar {
*/
RegistrationSpec forName(String name);
+ /**
+ * TODO
+ *
+ * @param spec
+ * @return
+ * @param
+ * @param
+ */
+ BatchLoaderRegistry register(FunctionBatchLoaderSpec spec);
+
+ /**
+ * TODO
+ *
+ * @param name
+ * @param loader
+ * @return
+ * @param
+ * @param
+ */
+ default BatchLoaderRegistry register(String name, BiFunction, BatchLoaderEnvironment, Flux> loader) {
+ return this.register(name, null, loader);
+ }
+
+ /**
+ * TODO
+ *
+ * @param name
+ * @param options
+ * @param loader
+ * @return
+ * @param
+ * @param
+ */
+ BatchLoaderRegistry register(String name, DataLoaderOptions options, BiFunction, BatchLoaderEnvironment, Flux> loader);
+
+ /**
+ * TODO
+ *
+ * @param name
+ * @param loader
+ * @return
+ * @param
+ * @param
+ */
+ default BatchLoaderRegistry registerMapped(String name, BiFunction, BatchLoaderEnvironment, Mono