Vorrei creare una corretta strategia di gestione delle proprietà in una webapp java che si basa su google guice come framework DI.Gestione proprietà di Google Guice
desidero avere un meccanismo di rispondere alle 3 requisiti seguenti:
- desidero poter iniettare proprietà usando guice (@Named)
- desidero poter accedere alle proprietà in modo statico
- Il meccanismo deve supportare la definizione delle priorità delle proprietà, ovvero una proprietà può essere incapsulata nella guerra distribuita con un determinato valore ma può anche essere ridondante nel livello di sistema di destinazione o nel file system locale (della macchina di destinazione Mi schiererò su), in tal caso il valore in guerra sarà sostituito dal valore th esiste nella macchina target.
Credo che questo sia un requisito standard. Ora, usando il raccoglitore standard Guice, posso facilmente ottenere il primo requisito, ma non gli altri due. Per ottenere gli altri due ho creato la mia classe che fa la seguente:
- avvolge e espone i metodi di rilegatura di Guice (quelle che lega le proprietà) Ad esempio:
public static void bindString(AnnotatedBindingBuilder<String> binder, String property, String defaultValue) { binder.annotatedWith(Names.named(property)).toInstance(getProperty(property, defaultValue)); }
Dove il metodo getProperty sa come gestire le mie proprietà (ricava il valore dal livello war o di sistema) e espone staticamente anche le proprietà.
Fondamentalmente, finché utilizzo questa utility che ho creato per il binding delle proprietà, sto bene, copre tutte le mie esigenze ma una volta che utilizzo i collegamenti standard guiz, sto perdendo il secondo e il terzo requisito.
C'è un modo per ignorare le associazioni di Guzzi e ottenere tutti questi 3 requisiti?
Una volta ho avuto la stessa sfida in un'app basata sulla primavera ed è stato abbastanza facile. Ho implementato ApplicationContextInitializer con il seguente metodo:
@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); }
quindi questo mi ha dato un modo per aggiungere proprietà locali con la massima priorità al mio ambiente. In caso di sovrapposizione con le proprietà di guerra, quelle locali avevano una priorità più alta. Inoltre ho esposto staticamente il mio ambiente in modo da avere accesso statico alle mie proprietà (per servizi che non sono gestiti dal container, legacy in gran parte).
Come posso ottenere questo risultato con guice?
Che cosa si intende, a cui si desidera accedere alle proprietà in modo statico? Vuol dire che hai casi d'uso in cui vuoi accedere a una particolare proprietà, ma non sai fino a runtime a quale proprietà vuoi accedere? –
Vorrei poter accedere a una proprietà utilizzando qualcosa come: SomeClass.getProperty ("my.property"); Questo dovrebbe essere utile per le classi che non sono gestite da guizzi (legacy di solito) e hanno ancora bisogno di accedere alle mie proprietà – forhas