Wie injiziere ich einen Eigenschaftswert in einer Klasse, die nicht von Spring verwaltet wird?

1. Überblick

Standardmäßig werden Klassen, die mit @ Repository, @Service, @Controller usw. versehen sind, von Spring verwaltet. Was nicht so einfach ist, ist die Konfiguration an Klassen zu übergeben, die nicht direkt von Spring verwaltet werden.

In diesem Fall können wir _ClassLoader - -basierte Konfigurationsladungen verwenden oder unsere Klassen in einer anderen Bean instanziieren und die erforderlichen Parameter manuell festlegen. Dies ist die empfohlene Option, da Konfigurationseinträge nicht ausschließlich in ** . Properties_ -Dateien gespeichert werden müssen.

In diesem kurzen Artikel behandeln wir das Thema Laden von ** . Properties -Dateien mit Java ClassLoader sowie die Injektion bereits von Spring geladene Konfiguration in eine nicht verwaltete Klasse.

2. Konfiguration mit Class Loader laden

Einfach ausgedrückt: ** . Properties -Dateien sind Ressourcendateien, die einige Konfigurationsinformationen enthalten. Anstelle von Implementierungen von Drittanbietern, die das automatische Laden von Anwendungskonfigurationen unterstützen, z. Wie in Spring implementiert, können wir Java ClassLoader verwenden, um dasselbe zu tun.

Wir werden ein Containerobjekt erstellen, das Properties enthält, das in resourceFileName definiert ist. Um den Container mit Konfiguration zu füllen, verwenden wir einen ClassLoader .

Definieren Sie die PropertiesLoader -Klasse, die die Methode loadProperties (String resourceFileName) implementiert:

public class PropertiesLoader {

    public static Properties loadProperties(String resourceFileName) throws IOException {
        Properties configuration = new Properties();
        InputStream inputStream = PropertiesLoader.class
          .getClassLoader()
          .getResourceAsStream(resourceFileName);
        configuration.load(inputStream);
        inputStream.close();
        return configuration;
    }
}

Jedes Class -Objekt enthält eine Referenz auf den ClassLoader , der es instanziiert hat. Dies ist ein Objekt, das hauptsächlich für das Laden von Klassen verantwortlich ist. In diesem Lernprogramm verwenden wir es jedoch zum Laden der Ressourcendatei anstelle einer einfachen Java-Klasse. Der ClassLoader sucht im Klassenpfad nach resourceFileName .

Anschließend laden wir die Ressourcendatei über die API getResourceAsStream als InputStream .

Im obigen Beispiel haben wir einen Konfigurationscontainer definiert, der resourceFileName mit der load (InputStream) -API analysieren kann.

Die load-Methode implementiert das Parsing von ** . Properties -Dateien mit Unterstützung von “:” oder “=” Zeichen als Trennzeichen. Darüber hinaus sind die “#” oder “!” Zeichen, die am Anfang der neuen Zeile verwendet werden, Kommentarmarkierungen und bewirken, dass diese Zeile ignoriert wird.

Schließlich lesen wir den genauen Wert des definierten Konfigurationseintrags aus unseren Konfigurationsdateien:

String property = configuration.getProperty(key);

3. Konfiguration mit Spring laden

Eine zweite Lösung besteht darin, die Spring Spring-Funktion zu nutzen, um das Laden und Bearbeiten von Dateien auf niedriger Ebene zu erledigen.

Definieren Sie einen Initializer , der die Konfiguration enthält, die zum Initialisieren unserer benutzerdefinierten Klasse erforderlich ist. Während der Initialisierung von Bean lädt das Framework alle mit @ Value gekennzeichneten Felder aus ** . Properties config-Datei:

@Component
public class Initializer {

    private String someInitialValue;
    private String anotherManagedValue;

    public Initializer(
      @Value("someInitialValue") String someInitialValue,
      @Value("anotherValue") String anotherManagedValue) {

        this.someInitialValue = someInitialValue;
        this.anotherManagedValue = anotherManagedValue;
    }

    public ClassNotManagedBySpring initClass() {
        return new ClassNotManagedBySpring(
          this.someInitialValue, this.anotherManagedValue);
    }
}

Der Initializer kann jetzt für die Instantiierung des __ClassNotManagedBySpring verantwortlich sein.

Jetzt greifen wir einfach auf unsere Initializer -Instanz zu und führen die initClass () -Methode darauf aus, um die Instantiierung unserer benutzerdefinierten ClassNotManagedBySpring zu übernehmen:

ClassNotManagedBySpring classNotManagedBySpring = initializer.initClass();

Sobald wir den Verweis auf Initializer haben, können wir unsere benutzerdefinierte __ClassNotManagedBySpring-Instanz instanziieren.

4. Zusammenfassung

In diesem kurzen Tutorial haben wir uns darauf konzentriert, Eigenschaften in eine Nicht-Spring-Java-Klasse zu lesen.

Eine Beispiel-Implementierung finden Sie wie immer unter over auf GitHub .