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.