Hi,
I will expose you a solution implemented in order to:
– filter imports/resource loading in a spring context of general applicationContext.xml,
– filter resources in imports or even overloading of beans,
– test the environment and conditionally add path locations,
For our example, in an web application with a root context definition applicationContext.xml:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:file1.properties</value> <value>classpath:file2.properties</value> <value>classpath:file3.properties</value> </list> </property> </bean> <import resource="classpath:huo-spring-business-services.xml" /> <import resource="classpath:huo-spring-datasource.xml" /> <import resource="classpath:huo-spring-security-config.xml" /> <import resource="classpath:huo-spring-security-access.xml" /> <import resource="classpath:huo-spring-wf.xml" />
This context is loaded in the web.xml file of web application:
<context-param> <param-name>contextClass</param-name> <param-value>org.springframework.web.context.support.XmlWebApplicationContext</param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param>
In our example, we want to filter the last import in the root context:
<import resource="classpath:huo-spring-wf.xml" />
in terms of a properties in the “huo.config.wf.enable” in the properties file “file3.properties”:
huo.config.wf.enable=false
So, we have create a new class ConditionalConfigurationXmlWebApplicationContext extending the Spring standard XmlWebApplicationContext. This new class can override the “refresh()”, “getConfigLocations()” or “getResources()” methods, where it will test its environment and possibly modify the “configLocations”.
Important note: To be catched by our above class, we nedd to add “classpath:” in all imports like ‘import resource=”classpath:spring-except.xml” ‘.
For our example and needs, it would do something like:
/** * Map containing the resources do not load */ private Map<String, Boolean> locationPatternRessourceNOLoad = new HashMap<String, Boolean>();
public ConditionalConfigurationXmlWebApplicationContext() { super(); // Exemple de filtrage wf { InputStream in = null; try{ String name = "file3.properties"; Properties result = null; ClassLoader loader = this.getClassLoader(); if (loader == null){ loader = ClassLoader.getSystemClassLoader (); } in = loader.getResourceAsStream (name); if (in != null){ result = new Properties (); result.load(in); // Can throw IOException } //for (Iterator iterator = result.keySet().iterator(); iterator.hasNext();) { // Object key = iterator.next(); // Object value = result.get(key); // System.out.println(key+"="+value); //} Object val = result.get("huo.config.wf.enable"); if(val != null){ locationPatternRessourceNOLoad.put("classpath:huo-spring-wf.xml", Boolean.parseBoolean(val.toString())); } }catch (Throwable ignore){ }finally{ if (in != null) try { in.close (); } catch (Throwable ignore) {} } } }
/** * Resolve the given location pattern into Resource objects. */ @Override public Resource[] getResources(String locationPattern) throws IOException{ { Boolean toLoad = true; if(locationPatternRessourceNOLoad.containsKey(locationPattern)){ toLoad = locationPatternRessourceNOLoad.get(locationPattern); } if(toLoad.booleanValue()){ // LOAD return super.getResources(locationPattern); }else{ // NO LOAD return new Resource[]{}; } } }
/** * Méthode appellée et retournant les fichiers paramétrés dans le paramètre "contextConfigLocation" du fichier web.xml */ /*@Override public String[] getConfigLocations() { //locations = append(locations, "classpath*:/META-INF/config/service-module-test-only.xml"); //setConfigLocations(locations); return super.getConfigLocations(); }*/
So, I have this in my web.xml:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextClass</param-name> <!-- <param-value>org.springframework.web.context.support.XmlWebApplicationContext</param-value> --> <param-value>huo.ConditionalConfigurationXmlWebApplicationContext</param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param>
ConditionalConfigurationXmlWebApplicationContext.zip
Source: XmlWebApplicationContext
Best regards,
Huseyin