Innanzitutto, ottenere uno InputStream
da cui devono essere caricate le proprietà. Questo può venire da un certo numero di località, tra cui alcuni dei più probabili:
- A
FileInputStream
, creata con un nome di file che è hard-coded o specificato tramite un system property. Il nome potrebbe essere relativo (per il lavoro corrente directory del processo Java) o assoluto.
- Un file di risorse (un file sul classpath), ottenuto tramite una chiamata a
getResourceAsStream
su Class
(relativo al file di classe) o ClassLoader
(relativo alla radice del percorso di classe). Si noti che questi metodi restituiscono null se la risorsa è mancante, invece di generare un'eccezione.
- A
URL
, che, come un nome file, potrebbe essere codificato o specificato tramite una proprietà di sistema.
quindi creare un nuovo Properties
oggetto, e passare il InputStream
al metodo load()
. Assicurati di chiudere lo stream, indipendentemente da eventuali eccezioni.
In un inizializzatore di classe, devono essere gestite eccezioni controllate come IOException
. È possibile generare un'eccezione non controllata, che impedirà l'inizializzazione della classe. Questo, a sua volta, di solito impedisce alla tua applicazione di funzionare affatto. In molte applicazioni, potrebbe essere preferibile utilizzare invece le proprietà predefinite o eseguire il fallback su un'altra fonte di configurazione, ad esempio richiedendo un utilizzo in un contesto interattivo.
Complessivamente, potrebbe essere simile a questo:
private static final String NAME = "my.properties";
private static final Properties config;
static {
Properties fallback = new Properties();
fallback.put("key", "default");
config = new Properties(fallback);
URL res = MyClass.getResource(NAME);
if (res == null) throw new UncheckedIOException(new FileNotFoundException(NAME));
URI uri;
try { uri = res.toURI(); }
catch (URISyntaxException ex) { throw new IllegalArgumentException(ex); }
try (InputStream is = Files.newInputStream(Paths.get(uri))) { config.load(is); }
catch (IOException ex) { throw new UncheckedIOException("Failed to load resource", ex); }
}
Lei parla di primavera - si usa il framework nell'applicazione che incorpora questa classe di utilità statica? – teabot
beh, è un po 'strano. la classe verrà utilizzata all'interno di un'app che utilizza il contenitore a molla. la classe stessa però non verrà cablata usando spring, deve essere solo una classe di utilità statica che viene chiamata dai thread worker che sono cablati da Spring. Posso modificare i thread di lavoro, ma non posso modificare il cablaggio di quei thread (quindi non posso usare PropertyPlaceHolderConfigurer) ... hm, ha senso? :) – xelurg