See: Description
| Interface | Description |
|---|---|
| Configuration |
Represents a set of configuration properties.
|
| Class | Description |
|---|---|
| ConfigurationSetting |
Declares a
ConfigurationSetting, specifying it's type, and default value. |
| ConfigurationSetting.Builder |
Builds
ConfigurationSetting instances |
| TimeDuration |
Represents a specification of a time duration.
|
| Annotation Type | Description |
|---|---|
| ConfigurationSetting.Description | Deprecated
since 20.3.0.
|
Each plugin may contribute zero or more ConfigurationSetting values. By declaring discoverable ConfigurationSetting values a plugin enables two things:
Inject injection site. This reduces coupling to the Plugin API, making it easier to re-use or share code in the plugin in other code bases and it also facilitates easier unit testing. Unit tests can just pass the the required values directly to the class under test, rather than having to pass values via the Configuration APIConfigurationBest practice is to define a constant for the setting name and use that constant rather than a literal string. The ConfigurationSetting should be defined as a final static constant. The field must be annotated with Named to indicate the unique name of the setting.
The field or it's enclosing type must be annotated with Provides so that the field is discoverable.
ConfigurationSetting data-types must be one of the following:
String - A textual valueInteger - An integer valueLong - A large integer valueBoolean - A boolean value. It is recommended that the default value for a Boolean setting is always Boolean.FALSEEnum - Where the value of is one of the case insensitive name of enum value namesTimeDuration - A value representing a duration
public interface PluginSettings {
static final String SETTING_FOO = "my.plugin.setting.foo";
}
@Provides
class PluginImpl {
@Named(PluginSettings.SETTING_FOO)
static final ConfigurationSetting FOO = ConfigurationSetting.setting(10);
}
public interface PluginSettings {
static final String ACCESS_MODE_SETTING = "my.plugin.accessMode";
}
@Provides
class PluginImpl {
@Named(PluginSettings.ACCESS_MODE_SETTING)
@ConfigurationSetting.Description(@TranslatableDescription(type = MyPluginMessages.class, id = MyPluginMessages.ACCESS_MODE_DESCRIPTION))
static final ConfigurationSetting ACCESS_MODE = ConfigurationSetting.setting(java.nio.AccessMode.class,
java.nio.AccessMode.READ);
}
When a ConfigurationSetting is declared as outlined above, the Dependency Injection runtime is able to map each setting to a concrete value derived from the Configuration instance applicable to the current scope. Thus instead of invoking Configuration.get(String) (which is strongly discouraged) a plugin service can just declare a dependency on the configuration setting value via an appropriately typed and Named parameter in it's constructor
For example to inject the my.plugin.setting.foo configuration setting value into some service, one would do:
@Provides
class MyPluginService implements SomeService {
@Inject
MyPluginService(final @Named(PluginSettings.FOO_SETTING) int foo) {
...
}
}
For ease of use, injection sites may use primitive types where applicable.
Integer can be injected as intLong can be injected as longBoolean can be injected as booleanNote in each case if no default value is specified for the setting and the Configuration also lacks a value for the setting then a runtime error will occur during creation of the service and likely lead to the application not starting.