Damit eine Komponente Component vom Framework instanziiert werden kann, benötigt sie einen Konstruktor mit der Signatur Component(InstantiationContext, Component.Config). Die Aufgabe des Komponentenkonstruktors ist es, die Konfiguration in der Komponente zu speichern und eventuell Subkomponenten zu instanziieren. Die Konfiguration wird mit dem für die Komponente speziellen Konfigurationsinterface Component.Config (nicht mit dem Wurzelinterface ConfigurationItem) deklariert. Über die Signatur des Komponentenkonstruktors ist es über Reflection möglich, für eine gegebene Komponentenklasse auf das für sie spezielle Konfigurationsinterface und damit auf die für sie zulässigen Konfigurationseigenschaften zu schließen.

Eine konfigurierbare Klasse:

public class Foo<C extends Foo.Config<?>> implements ConfiguredInstance<C> {

  public interface Config<I extends Foo<?>> extends PolymorphicConfiguration<I> {
    ...
  }

  private final C _config;

  public Foo(InstantiationContext context, C config) {
    _config = config;
   ...
  }

  @Override
  public C getConfig() {
    return _config;
  }

}

Eine Ableitung einer solchen Klasse muss folgendermaßen aussehen:

public class Bar<C extends Bar.Config<?>> extends Foo<C> {

  public interface Config<I extends Bar<?>> extends Foo.Config<I> {
    ...
  }

  public Bar(InstantiationContext context, C config) {
    super(context, config);
   ...
  }

}

Wichtig: Der Config-Constructor darf nicht direkt aufgerufen werden. Er darf ausschließlich vom InstantiationContext aufgerufen werden:

PolymorphicConfiguration<Foo> myConfig = ...;
InstantiationContext context = new DefaultInstantiationContext(...);
Foo myInstance = context.getInstance(myConfig);