2015-03-21 2 views
6

Sto usando Spring MVC 4.1.4Come impostare la configurazione globale/variabile in Spring MVC 4?

Ho alcune impostazioni globali da condividere in tutta l'applicazione

Questi impostazione deve essere caricato solo quando avviare il server

So che posso usare context-param

<context-param> 
    <param-name>configA</param-name> 
    <param-value>valueA</param-value> 
</context-param> 
<context-param> 
    <param-name>configB</param-name> 
    <param-value>valueB</param-value> 
</context-param> 

Ma io voglio conservare un oggetto complesso, come questo

HashMap myConfig = new HashMap(); 

String[] cfgB={"b1", "b2"}; 

HashMap<String, String> cfgC=new HashMap<String, String>(); 
cfgC.put("C1", "1"); 
cfgC.put("C2", "2"); 

MyConfigD cfgD = new MyConfigD(); 

myConfig.put("configA", "A"); 
myConfig.put("configB",cfgB); 
myConfig.put("configC",cfgC); 
myConfig.put("configD",cfgD); 

contesto-param non è possibile farlo, cos'altro posso usare in Java o Spring?

risposta

7

Se non si dispone di restrizioni e si ha la flessibilità di decidere come impostare le proprietà, ci sono due opzioni.

Per prima cosa è sufficiente definire Beans in Java code in una classe @Configuration. Per la maggior parte degli oggetti, puoi avere bean che sono @Autowired. Tutti i bean vengono caricati solo in fase di esecuzione. Per Maps (e Liste e simili), li si definisce come bean e quindi li si accede con l'annotazione @Resource. Tieni presente che per questi tipi non è possibile accedere a Maps con @Autowired, Spring uses @Resource.

Contrariamente a un commento sull'altra risposta, sostengo che le impostazioni possono anche essere definite nel codice, solo perché è scritto in XML non lo rende diverso, sono considerate equivalenti. Scrivendo la tua configurazione e le impostazioni in Java ottieni la potenza di OOP che è fantastica quando hai configurazioni complesse.

dichiarazione Esempio Bean: utilizzo

@Bean 
public MyConfig myConfig() { 
    final MyConfig myConfig = new MyConfig(); 
    myConfig.put("configA", "A"); 
    ... 
    return myConfig; 
} 

@Bean 
public Map<String, String> myMap() { 
    final Map<String, String> myMap = new HashMap<>(); 
    myMap.put("A", "a"); 
    return myMap; 
} 

Esempio:

@Autowired 
private MyConfig myConfig; 

@Resource(name = "myMap") 
private Map<String, String> myMap; 

In secondo luogo è quello di utilizzare le proprietà di sistema globali, definiti in un file properties. È possibile scrivere proprietà in YAML o una configurazione del tipo di mappa. Dettagli nel link fornito. Modifica È possibile assegnare un nome alle proprietà e quindi fare riferimento ad esse con l'annotazione @Value. Puoi anche avere collections in YAML.

application.properties

myConfig.configA:A 
myConfig.configB:B 
myConfig.coll.cA:['a','b','c'] 
myConfig.coll.cB:{a:A,b:B,c:C} 
... 

Nel codice

@Value("${myConfig.configA}") 
private String configA; 
+0

puoi mostrare la dichiarazione del bean e l'esempio completo di utilizzo? Sono confuso in quale file hai scritto questi esempi, grazie –

0

Puoi semplicemente dichiarare le tue mappe con <util:map> nel file applicationContext.xml.

campo di applicazione dovrebbe essere Singleton

Tipo/classe può essere java.util.HashMap

È quindi possibile che @Autowired fagiolo in componenti.

+0

è possibile utilizzare listener per lo stesso – Programmer

+0

C'è qualche soluation non XML? –

+0

U è in grado di codificarli in una classe annotata @Component.Ma poi non puoi più considerarlo come impostazioni, quindi fa parte della tua applicazione. –