[[_config_spi_providers]]

=== Configure SPI Providers

The specifics of each configuration setting is discussed elsewhere in 
context with that setting.  However, it is useful to understand the format used
to declare settings on SPI providers. 

{{book.project.name}} is a highly modular system that allows great
flexibility.  There are more than 50 service provider interfaces (SPIs), and
you are allowed to swap out implementations of each SPI.  An implementation of 
an SPI is known as a _provider_.

All elements in an SPI declaration are optional, but a full SPI declaration
 looks like this:
[source,xml]
----
<spi name="myspi">
    <default-provider>myprovider</default-provider>
    <provider name="myprovider" enabled="true">
        <properties>
            <property name="foo" value="bar"/>
        </properties>
    </provider>
    <provider name="mysecondprovider" enabled="true">
        <properties>
            <property name="foo" value="foo"/>
        </properties>
    </provider>
</spi>
----
Here we have two providers defined for the SPI `myspi`.  The `default-provider`
is listed as `myprovider`.  However it is up to the SPI to decide how it will treat
this setting.  Some SPIs allow more than one provider and some do not.  So
`default-provider` can help the SPI to choose.

Also notice that each provider defines its own set of configuration properties.  
The fact that both providers above have a property called `foo` is just a
coincidence.

The type of each property value is interpreted by the provider.  However, there
is one exception.  Consider the `jpa` provider for the `eventStore` API:
[source,xml]
----
<spi name="eventsStore">
    <provider name="jpa" enabled="true">
        <properties>
            <property name="exclude-events" value="[&quot;EVENT1&quot;,
                                                    &quot;EVENT2&quot;]"/>
        </properties>
    </provider>
</spi>
----
We see that the value begins and ends with square brackets.  That means that
the value will be passed to the provider as a list.  In this example, the system will pass the
provider a list with two element values _EVENT1_ and _EVENT2_. To add more values
to the list, just separate each list element with a comma. Unfortunately,
you do need to escape the quotes surrounding each list element with `\&quot;`.