https://github.com/ehcache/ehcache3/blob/master/core/src/main/java/org/ehcache/core/spi/service/ServiceFactory.java package org.ehcache.core.spi.service; import org.ehcache.spi.service.ServiceProvider; import org.ehcache.spi.service.Service; import org.ehcache.spi.service.ServiceCreationConfiguration; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * A factory abstraction that can create {@link Service} instances. */ public interface ServiceFactory { /** * Returns {@code true} if this factory's services are mandatory in all environments. * * @return {@code true} if this factory's services are mandatory */ default boolean isMandatory() { return false; } /** * Returns an optional ranking integer is used to choose a service factory when multiple factories are available for * the same service type. Higher ranking value service factories are preferred. * * @return a factory ranking value */ default int rank() { return 1; } /** * Creates an instance of the service using the passed in {@link ServiceCreationConfiguration}. *

* Note that a {@code null} configuration may be supported or even required by a service implementation. * * @param configuration the creation configuration, can be {@code null} for some services * @return the new service, not {@link Service#start(ServiceProvider) started} */ T create(ServiceCreationConfiguration configuration); /** * Queries a {@code ServiceFactory} to know which {@link Service} type it produces. * * @return the class of the produced service. */ Class getServiceType(); @Retention(RUNTIME) @Target(ElementType.TYPE) @interface RequiresConfiguration { } }