Provide factory instances for AppEngine APIs. Each API will have an associated
FactoryProvider registered with this class. N.B. Once <xref uid="com.google.appengine.spi.ServiceFactoryFactory.
To construct the runtime mapping, this class first uses java.util.ServiceLoader to
find all registered FactoryProvider entities using the ClassLoader of
ServiceFactoryFactory. Finally, the explicitly registered providers
<xref uid="com.google.appengine.spi.ServiceFactoryFactory.register(com.google.appengine.spi.FactoryProvider<I>)" data-throw-if-not-resolved="false">#register(FactoryProvider) are merged in.
If ServiceLoader locates multiple providers for a given factory interface, the
ambiguity can be resolved by using the ServiceProvider#precedence annotation property
(higher precedence wins; the google implementations all have precedence
Integer.MIN_VALUE). An exception is raised if the ambiguity cannot be resolved. Note that
explicit registration (<xref uid="com.google.appengine.spi.ServiceFactoryFactory.register(com.google.appengine.spi.FactoryProvider<I>)" data-throw-if-not-resolved="false">#register(FactoryProvider)) always takes precedence (it does not
honor the ServiceProvider#precedence annotation property).
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-04 UTC."],[[["\u003cp\u003eThis package is designed to support alternate implementations of Google App Engine services, but it is not intended for direct use in application code.\u003c/p\u003e\n"],["\u003cp\u003eVendors can provide alternate implementations of services like DatastoreService by implementing \u003ccode\u003eIDatastoreServiceFactory\u003c/code\u003e and returning their custom \u003ccode\u003eDatastoreService\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eFactory implementations are discovered through \u003ccode\u003eFactoryProvider\u003c/code\u003e registered with \u003ccode\u003eServiceFactoryFactory\u003c/code\u003e, often using \u003ccode\u003ejava.util.ServiceLoader\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003e\u003ccode\u003eServiceFactoryFactory\u003c/code\u003e is responsible for providing factory instances for AppEngine APIs and is not meant for end users.\u003c/p\u003e\n"],["\u003cp\u003eThe precedence of multiple providers for a single factory interface can be resolved via the \u003ccode\u003eServiceProvider#precedence\u003c/code\u003e annotation, with higher values taking precedence, although explicitly registered providers will always take precedence.\u003c/p\u003e\n"]]],[],null,["# Package com.google.appengine.spi (2.0.0)\n\nSupport for alternate implementations of Google App Engine services. ***This package is not\nintended for use by application code.***\n\nIf, for example, vendor X wanted to provide an alternate implementation of the\nDatastoreService, they would have to provide an implementation of [com.google.appengine.api.datastore.IDatastoreServiceFactory](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.api.datastore.IDatastoreServiceFactory) that returns their implementation\nfor [com.google.appengine.api.datastore.DatastoreService](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.api.datastore.DatastoreService).\n\nFactory implementations are acquired using a [FactoryProvider](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.FactoryProvider) registered with [ServiceFactoryFactory](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.ServiceFactoryFactory). These providers are typically discovered using java.util.ServiceLoader; see [com.google.appengine.spi.ServiceFactoryFactory](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.ServiceFactoryFactory) for details.\n\nThis package includes the utility ([ServiceProvider](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.ServiceProvider) for inserting the appropriate \"service\" entries into a jar file.\n\nClasses\n-------\n\n### [FactoryProvider\\\u003cI\\\u003e](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.FactoryProvider)\n\nA base class for service factory creation that can be registered with the ProviderRegistry.\n\n### [ServiceFactoryFactory](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.ServiceFactoryFactory)\n\n**This class is not intended for end users.**\n\nProvide factory instances for AppEngine APIs. Each API will have an associated\n[FactoryProvider](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.FactoryProvider) registered with this class. N.B. *Once \\\u003cxref uid=\"com.google.appengine.spi.ServiceFactoryFactory.*\n\nTo construct the runtime mapping, this class first uses `java.util.ServiceLoader` to\nfind all registered [FactoryProvider](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.FactoryProvider) entities using the `ClassLoader` of\n`ServiceFactoryFactory`. Finally, the explicitly registered providers\n\\\u003cxref uid=\"com.google.appengine.spi.ServiceFactoryFactory.*register(com.google.appengine.spi.FactoryProvider\\\u003cI\\\u003e)\" data-throw-if-not-resolved=\"false\"\\\u003e#register(FactoryProvider) are merged in.*\n\n*If `ServiceLoader` locates multiple providers for a given factory interface, the\nambiguity can be resolved by using the [ServiceProvider#precedence](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.ServiceProvider#com_google_appengine_spi_ServiceProvider_precedence_) annotation property\n(higher precedence wins; *the google implementations all have precedence\nInteger.MIN_VALUE* ). An exception is raised if the ambiguity cannot be resolved. Note that\nexplicit registration (\\\u003cxref uid=\"com.google.appengine.spi.ServiceFactoryFactory.*register(com.google.appengine.spi.FactoryProvider\\\u003cI\\\u003e)\" data-throw-if-not-resolved=\"false\"\\\u003e#register(FactoryProvider)) always takes precedence (it does not\nhonor the [ServiceProvider#precedence](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.ServiceProvider#com_google_appengine_spi_ServiceProvider_precedence_) annotation property).**\n\n### [ServicesFile](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.ServicesFile)\n\nA helper class for reading and writing Services files.\nSee Also: java.util.ServiceLoader\n\nAnnotation Types\n----------------\n\n### [ServiceProvider](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.ServiceProvider)\n\nSpecifies the precedence that [ServiceFactoryFactory](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.ServiceFactoryFactory) gives to the annotated [FactoryProvider](/appengine/docs/standard/java-gen2/reference/services/bundled/latest/com.google.appengine.spi.FactoryProvider)."]]