diff --git a/src/main/java/io/ebean/config/ServerConfigProvider.java b/src/main/java/io/ebean/config/ServerConfigProvider.java new file mode 100644 index 000000000..b6ba8571a --- /dev/null +++ b/src/main/java/io/ebean/config/ServerConfigProvider.java @@ -0,0 +1,39 @@ +package io.ebean.config; + +/** + * Provides a ServiceLoader based mechanism to configure a ServerConfig. + *

+ * Provide an implementation and register it via the standard Java ServiceLoader mechanism + * via a file at META-INF/services/io.ebean.config.ServerConfigProvider. + *

+ *

+ * If you are using a DI container like Spring or Guice you are unlikely to use this but instead use a + * spring specific configuration. When we are not using a DI container we may use this mechanism to + * explicitly register the entity beans and avoid classpath scanning. + *

+ *
{@code
+ *
+ * public class EbeanConfigProvider implements ServerConfigProvider {
+ *
+ *   @Override
+ *   public void apply(ServerConfig config) {
+ *
+ *     // register the entity bean classes explicitly
+ *     config.addClass(Customer.class);
+ *     config.addClass(User.class);
+ *     ...
+ *   }
+ * }
+ *
+ * }
+ */ +public interface ServerConfigProvider { + + /** + * Apply the configuration to the ServerConfig. + *

+ * Typically we explicitly register entity bean classes and thus avoid classpath scanning. + *

+ */ + void apply(ServerConfig config); +} diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java b/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java index 01cc62637..a8cf20c08 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java @@ -6,6 +6,7 @@ import io.ebean.cache.ServerCacheOptions; import io.ebean.cache.ServerCachePlugin; import io.ebean.config.ContainerConfig; import io.ebean.config.ServerConfig; +import io.ebean.config.ServerConfigProvider; import io.ebean.config.TenantMode; import io.ebean.config.UnderscoreNamingConvention; import io.ebean.config.dbplatform.DatabasePlatform; @@ -102,8 +103,13 @@ public class DefaultContainer implements SpiContainer { public SpiEbeanServer createServer(ServerConfig serverConfig) { synchronized (this) { - setNamingConvention(serverConfig); + if (serverConfig.isDefaultServer()) { + for (ServerConfigProvider configProvider : ServiceLoader.load(ServerConfigProvider.class)) { + configProvider.apply(serverConfig); + } + } + setNamingConvention(serverConfig); BootupClasses bootupClasses = getBootupClasses(serverConfig); boolean online = true;