Instanzkonfiguration
Neben reinen Konfigurationen gibt es den häufig angewendeten Spezialfall der Instanzkonfiguration. Eine Instanzkonfiguration dient dazu, eine konfigurierbare Komponente zu instanziieren.
Instanzkonfigurationen werden statt von ConfigurationItem
von PolymorphicConfiguration
abgeleitet. Sie hat ein ausgezeichnetes Konfigurationsproperty class
(vgl. PolymorphicConfiguration#getImplementationClass()
). Dieses spezielle Property hat zwei Funktionen:
- In der Konfiguration wird darüber die Implementierungsklasse angegeben, welche mit der entsprechenden Konfiguration gebaut werden soll.
- Die angegebene Implementierungsklasse bestimmt über ihren Konfigurationskonstruktor das konkrete Konfigurations(sub)interface, welches verwendet werden muss. Implizit wählt damit die Implementierungsklasse den Konfigurationstyp, mit dem sie konfiguriert werden kann.
Im folgenden Beispiel deklariert eine abstrakte konfigurierbare Komponente Component
ein Konfigurationsinterface Component.Config
, und referenziert dieses in ihrem Konfigurationskonstruktor. Für den Komponentennamen und den Namen des Konfigurationsinterfaces gibt es keine Einschränkungen.
public abstract class Component {
public interface Config extends PolymorphicConfiguration<Component> {
int getOption();
}
/** Konfigurationskonstruktor */
Component(InstantiationContext context, Config config) {
...
}
}
Die konkrete Ableitung MyComponent1
verwendet dieselben (geerbten) Konfigurationsoptionen (liefert lediglich einen Implementierungsanteil):
public class MyComponent1 extends Component {
MyComponent1(InstantiationContext context, Config config) {
...
}
}
Eine Instanz von MyComponent1
kann durch Angabe der Implementierungsklasse und ihrer Konfigurationoptionen konfiguriert werden:
<component class="my.package.MyComponent1"
option="42"
/>
MyComponent2
deklariert ein spezialisiertes Konfigurationsinterface und erlaubt damit neben der Konfigurationsoption option
aus Component
die zusätzliche Option other-option
:
public class MyComponent2 extends Component {
public interface Config extends Component.Config {
String getOtherOption();
}
MyComponent2(InstantiationContext context, Config config) {
...
}
}
In der Konfiguration einer Instanz von MyComponent2
ist damit implizit die Angabe eines Wertes für die spezialisierte Konfigurationsoption other-config
möglich:
<component class="my.package.MyComponent2"
option="42"
otherOption="Hello World!"
/>
Die Kombination der Implementierungsklasse MyComponent1
mit der Konfigurationsoption other-option
würde als Konfiguationsfehler erkannt werden.