2021.06

Konfigurierbare Klasseninstanzen

Oft ist es nötig Implementierungen auszutauschen, diese Implementierungen benötigen oft zusätzliche Properties. Um die Austauschbarkeit und das Zuweisen von weiteren Properties zu vereinfachen, ist es möglich Instanzen einer Klasse mit der Angabe eines Properties von MyCoRe erzeugen zu lassen.

Erzeugen einer Instanz

Für das Erzeugen einer Instanz kann die statische Methode getInstanceOf in der Klasse org.mycore.common.config.MCRConfiguration2 verwendet werden.

Java-Code:
1
Optional<MeinInterface> instanz = MCRConfiguration2.getInstanceOf("Mein.Interface.Implementierung"); 
Properties:
1
Mein.Interface.Implementierung=org.gbv.MeineKlasse 

Zuweisen von Properties mit @MCRProperty

Falls die Klasse org.gbv.MeineKlasse zusätzliche Properties benötigt, dann kann man diese über die Annotation @MCRProperty einem Feld oder einer Setter-Methode zuweisen. Das Feld muss public sein und den Typ String haben. Die Setter-Methode muss public und vom Typ void sein und als einzigen Parameter einen String akzeptieren.

Properties:
1
2
3
Mein.Interface.Implementierung=org.gbv.MeineKlasse
Mein.Interface.Implementierung.Foo=bar
Mein.Interface.Implementierung.Foobar=baz 
Java-Code in der Klasse org.gbv.MeineKlasse:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
private String foo;

@MCRProperty(name = "Foobar", required = false)
public String foobar;

@MCRProperty(name = "Foo")
public void setFoo(String foo){
    this.foo = foo;
}

@MCRProperty(name = "*")
public Map<String, String> bat; 

In dem oberen Beispiel würde der Inhalt bar des Properties Mein.Interface.Implementierung.Foo an die Methode setFoo übergeben werden. Falls das Property nicht gesetzt ist, dann wird ein Fehler geworfen, weil die Properties als benötigt (required=true) voreingestellt sind. Wird ein Property nicht unbedingt benötigt, dann kann man die required auf false setzen, wie in dem oberen Beispiel das Property Foobar.

Falls man alle Properties benötigt gibt es die Möglichkeit mit einem Wildcard-Symbol als Namen eine Map zu bekommen. Die Schlüssel sind dabei die Namen (Foo, Foobar) und die Werte der Inhalt der Properties (bar, baz).

Initialisierungsreihenfolge

Die Reihenfolge der Initialisierung ist:

  1. Aufrufen des Konstruktors
  2. Zuweisung der annotierten Felder
  3. Aufrufen der annotierten Methoden
  4. Aufrufen der mit @MCRPostConstruction annotierten Methode

Nachträgliche Initialisierung mit @MCRPostConstruction

Da man Felder eines Objektes nicht zuweisen kann bevor der Konstruktor aufgerufen wurde, aber man für die Initialisierung trotzdem die zugewiesenen Felder benötigt, gibt es die Möglichkeit eine weitere Methode nach der Initialisierung aufrufen zu lassen. Dazu muss die Methode public sein und einen String-Parameter besitzen und mit @MCRPostConstruction annotiert sein.

Java-Code:
1
2
3
4
@MCRPostConstruction
public void init(String property) {
  assert this.foo!=null;
} 

Das Property in dem die Klasse definiert wurde, wird der annotierten Methode als parameter übergeben. Im oberen Beispiel wäre das Mein.Interface.Implementierung.