Ich möchte eine ordnungsgemäße Eigenschaften-Management-Strategie in einer Java-Webanwendung erstellen, die auf Google Guice als DI-Framework weiterleitet.Google Guice Properties Management
Ich möchte einen Mechanismus haben, die folgenden 3-Anforderungen zu beantworten:
- Ich mag würde in der Lage sein Eigenschaften einzuspritzen Verwendung guice (@Named)
- ich möchte in der Lage sein, Objekte zugreifen statisch
- Der Mechanismus sollte die Priorisierung von Eigenschaften unterstützen, was bedeutet, dass eine Eigenschaft in den implementierten Krieg mit einem bestimmten Wert eingeschlossen werden kann, aber auch auf der Zielsystemebene oder dem lokalen Dateisystem (der Zielmaschine) redundant sein kann Ich setze auf), in einem solchen Fall wird der Wert im Krieg durch den Wert th außer Kraft gesetzt at existiert in der Zielmaschine.
Ich glaube, das ist eine Standardanforderung. Jetzt kann ich mit dem Standardbinder von Guice die erste Anforderung leicht erreichen, aber nicht die anderen beiden. Um die beiden anderen zu bekommen habe ich meine eigene Klasse, macht folgendes:
- Wraps und macht die Bindungsmethoden von Guice (jene, die Eigenschaften bindet) Zum Beispiel:
public static void bindString(AnnotatedBindingBuilder<String> binder, String property, String defaultValue) { binder.annotatedWith(Names.named(property)).toInstance(getProperty(property, defaultValue)); }
Wo Die getProperty-Methode weiß, wie man mit meinen Eigenschaften umgeht (man erhält den Wert von der Kriegs- oder Systemebene) und stellt die Eigenschaften auch statisch dar.
Also im Grunde, solange ich dieses Dienstprogramm verwende, das ich für Eigenschaften Bindings erstellt habe, bin ich gut, es deckt alle meine Anforderungen ab, aber sobald ich die Standard-Guice Bindings verwende, verliere ich die zweite und dritte Anforderung.
Gibt es eine Möglichkeit, die Guice-Bindungen zu überschreiben und all diese 3 Anforderungen zu erhalten?
Einmal hatte ich die gleiche Herausforderung in einer Feder basierten App und war ziemlich einfach. Ich implementierte ApplicationContextInitializer mit folgenden Methode:
@Override public void initialize(ConfigurableWebApplicationContext ctx) { PropertySource<Map<String, Object>> localProps = null; try { localProps = new ResourcePropertySource(new ClassPathResource(LOCAL_PROPERTIES_FILE_NAME)); } catch (IOException e) { LOG.fatal("Could not load local properties from classpath " + LOCAL_PROPERTIES_FILE_NAME); return; } LOG.info("Loaded configuration from classpath local file " + LOCAL_PROPERTIES_FILE_NAME); ctx.getEnvironment().getPropertySources().addFirst(localProps); }
so gab diesen mir einen Weg, um lokale Eigenschaften mit höchster Priorität zu meiner Umwelt hinzuzufügen. Bei Überschneidungen mit Kriegseigenschaften hatten die lokalen Vorrang. Außerdem habe ich meine Umgebung statisch dargestellt, so dass ich statischen Zugriff auf meine Eigenschaften habe (für Dienste, die nicht vom Container verwaltet werden, meist Legacy).
Wie kann ich dies mit guice erreichen?
Was meinen Sie, dass Sie die Eigenschaften in einer statischen Art und Weise zugreifen möchten? Bedeutet das, dass Sie Anwendungsfälle haben, in denen Sie auf eine bestimmte Eigenschaft zugreifen möchten, aber Sie wissen nicht bis zur Laufzeit, auf welche Eigenschaft Sie zugreifen möchten? –
Ich möchte auf eine Eigenschaft zugreifen können, die etwas wie verwendet: SomeClass.getProperty ("my.property"); Dies sollte für Klassen nützlich sein, die nicht von guice verwaltet werden (normalerweise Legacy) und trotzdem Zugriff auf meine Eigenschaften benötigen. – forhas