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;
}
}
public deklariert sein.public sein.public sein.PolymorphicConfiguration erben.ConfiguredInstance implementieren. Das ist für verschiedene weitergehende Features notwendig, für die Instanziierung an sich aber nicht. Statt ConfiguredInstance direkt zu implementieren, kann als Basisklasse AbstractConfiguredInstance verwendet werden.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);