diff --git a/src/main/java/io/ebean/EbeanServerFactory.java b/src/main/java/io/ebean/EbeanServerFactory.java
index 76bfc2dac..090e23e9a 100644
--- a/src/main/java/io/ebean/EbeanServerFactory.java
+++ b/src/main/java/io/ebean/EbeanServerFactory.java
@@ -1,12 +1,12 @@
package io.ebean;
-import io.ebean.common.SpiContainer;
import io.ebean.config.ContainerConfig;
import io.ebean.config.ServerConfig;
-import io.ebean.service.SpiContainerShutdown;
+import io.ebean.service.SpiContainer;
+import io.ebean.service.SpiContainerFactory;
import javax.persistence.PersistenceException;
-import java.lang.reflect.Constructor;
+import java.util.Iterator;
import java.util.Properties;
import java.util.ServiceLoader;
@@ -31,8 +31,6 @@ import java.util.ServiceLoader;
public class EbeanServerFactory {
- private static final String DEFAULT_CONTAINER = "io.ebeaninternal.server.core.DefaultContainer";
-
private static SpiContainer container;
/**
@@ -100,9 +98,7 @@ public class EbeanServerFactory {
*
*/
public static synchronized void shutdown() {
- for (SpiContainerShutdown shutdown : ServiceLoader.load(SpiContainerShutdown.class)) {
- shutdown.shutdown();
- }
+ container.shutdown();
}
@@ -138,14 +134,10 @@ public class EbeanServerFactory {
*/
protected static SpiContainer createContainer(ContainerConfig containerConfig) {
- String implClassName = System.getProperty("ebean.container", DEFAULT_CONTAINER);
-
- try {
- Class> cls = Class.forName(implClassName);
- Constructor> constructor = cls.getConstructor(ContainerConfig.class);
- return (SpiContainer) constructor.newInstance(containerConfig);
- } catch (Exception ex) {
- throw new RuntimeException(ex);
+ Iterator factories = ServiceLoader.load(SpiContainerFactory.class).iterator();
+ if (factories.hasNext()) {
+ return factories.next().create(containerConfig);
}
+ throw new IllegalStateException("Service loader didn't find a SpiContainerFactory?");
}
}
diff --git a/src/main/java/io/ebean/common/SpiContainer.java b/src/main/java/io/ebean/service/SpiContainer.java
similarity index 96%
rename from src/main/java/io/ebean/common/SpiContainer.java
rename to src/main/java/io/ebean/service/SpiContainer.java
index 7e7833634..3f1ffc9a1 100644
--- a/src/main/java/io/ebean/common/SpiContainer.java
+++ b/src/main/java/io/ebean/service/SpiContainer.java
@@ -1,4 +1,4 @@
-package io.ebean.common;
+package io.ebean.service;
import io.ebean.EbeanServer;
import io.ebean.config.ServerConfig;
diff --git a/src/main/java/io/ebean/service/SpiContainerFactory.java b/src/main/java/io/ebean/service/SpiContainerFactory.java
new file mode 100644
index 000000000..42c86e676
--- /dev/null
+++ b/src/main/java/io/ebean/service/SpiContainerFactory.java
@@ -0,0 +1,14 @@
+package io.ebean.service;
+
+import io.ebean.config.ContainerConfig;
+
+/**
+ * Provides shutdown of the entire container.
+ */
+public interface SpiContainerFactory {
+
+ /**
+ * Create the Container that builds EbeanServer instances.
+ */
+ SpiContainer create(ContainerConfig containerConfig);
+}
diff --git a/src/main/java/io/ebean/service/SpiContainerShutdown.java b/src/main/java/io/ebean/service/SpiContainerShutdown.java
deleted file mode 100644
index 1be722077..000000000
--- a/src/main/java/io/ebean/service/SpiContainerShutdown.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package io.ebean.service;
-
-/**
- * Provides shutdown of the entire container.
- */
-public interface SpiContainerShutdown {
-
- /**
- * Shutdown the entire container - all EbeanServer instances.
- */
- void shutdown();
-}
diff --git a/src/main/java/io/ebeaninternal/server/DContainerFactory.java b/src/main/java/io/ebeaninternal/server/DContainerFactory.java
new file mode 100644
index 000000000..ea9f0b109
--- /dev/null
+++ b/src/main/java/io/ebeaninternal/server/DContainerFactory.java
@@ -0,0 +1,17 @@
+package io.ebeaninternal.server;
+
+import io.ebean.config.ContainerConfig;
+import io.ebean.service.SpiContainer;
+import io.ebean.service.SpiContainerFactory;
+import io.ebeaninternal.server.core.DefaultContainer;
+
+/**
+ * Default container factory found via service loader.
+ */
+public class DContainerFactory implements SpiContainerFactory {
+
+ @Override
+ public SpiContainer create(ContainerConfig containerConfig) {
+ return new DefaultContainer(containerConfig);
+ }
+}
diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java b/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java
index c2564af6a..5b511cf8b 100644
--- a/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java
+++ b/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java
@@ -4,7 +4,7 @@ import io.ebean.BackgroundExecutor;
import io.ebean.cache.ServerCacheFactory;
import io.ebean.cache.ServerCacheOptions;
import io.ebean.cache.ServerCachePlugin;
-import io.ebean.common.SpiContainer;
+import io.ebean.service.SpiContainer;
import io.ebean.config.ContainerConfig;
import io.ebean.config.PropertyMap;
import io.ebean.config.ServerConfig;
@@ -71,7 +71,7 @@ public class DefaultContainer implements SpiContainer {
@Override
public void shutdown() {
- clusterManager.shutdown();
+ ShutdownManager.shutdown();
}
/**
diff --git a/src/main/java/io/ebeaninternal/server/lib/DContainerShutdown.java b/src/main/java/io/ebeaninternal/server/lib/DContainerShutdown.java
deleted file mode 100644
index 0b83469c9..000000000
--- a/src/main/java/io/ebeaninternal/server/lib/DContainerShutdown.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package io.ebeaninternal.server.lib;
-
-import io.ebean.service.SpiContainerShutdown;
-
-/**
- * Default container shutdown implementation.
- */
-public class DContainerShutdown implements SpiContainerShutdown {
-
- @Override
- public void shutdown() {
- ShutdownManager.shutdown();
- }
-}
diff --git a/src/main/java/io/ebeaninternal/server/lib/ShutdownManager.java b/src/main/java/io/ebeaninternal/server/lib/ShutdownManager.java
index 032592700..beed51f59 100644
--- a/src/main/java/io/ebeaninternal/server/lib/ShutdownManager.java
+++ b/src/main/java/io/ebeaninternal/server/lib/ShutdownManager.java
@@ -1,6 +1,6 @@
package io.ebeaninternal.server.lib;
-import io.ebean.common.SpiContainer;
+import io.ebean.service.SpiContainer;
import io.ebeaninternal.api.ClassUtil;
import io.ebeaninternal.api.SpiEbeanServer;
import org.slf4j.Logger;
diff --git a/src/main/resources/META-INF/services/io.ebean.service.SpiContainerFactory b/src/main/resources/META-INF/services/io.ebean.service.SpiContainerFactory
new file mode 100644
index 000000000..ebf1f50d5
--- /dev/null
+++ b/src/main/resources/META-INF/services/io.ebean.service.SpiContainerFactory
@@ -0,0 +1 @@
+io.ebeaninternal.server.DContainerFactory
diff --git a/src/main/resources/META-INF/services/io.ebean.service.SpiContainerShutdown b/src/main/resources/META-INF/services/io.ebean.service.SpiContainerShutdown
deleted file mode 100644
index ffcbd2b22..000000000
--- a/src/main/resources/META-INF/services/io.ebean.service.SpiContainerShutdown
+++ /dev/null
@@ -1 +0,0 @@
-io.ebeaninternal.server.lib.DContainerShutdown