caricamento di una variabile primavera applicationContext.xml file in base a una proprietà specificata al di fuori dell’app guerra file?

Ho bisogno di cambiare la molla applicationContext.xml file che viene utilizzato, basato su una proprietà, questa proprietà DEVE essere definito da qualche parte al di fuori della guerra file (ie. non può essere in web.xml). Attualmente, sono arrivato alla seguente soluzione (vedi la mia risposta qui sotto), chiedo se c’è un modo migliore per fare questo?

InformationsquelleAutor shsteimer | 2010-10-28



3 Replies
  1. 2

    Hai pensato di utilizzare il beanRefContext approccio. (ContextSingletonBeanFactoryLocator). In questo modo è possibile configurare la primavera del file di configurazione (e i loro nomi) via un’altra primavera del file di configurazione.

    Allora si può paramaterise file da qualunque sia il mezzo che ritiene più opportuni e di passare i nomi dei file in quel modo.

    Il file simile a questo:

    <beans>
        <bean id="businessBeanFactory" class="org.springframework.context.support.ClassPathXmlApplicationContext">
            <constructor-arg value="${NameOfBeanConfigFile}" />
        </bean>
    </beans>

    E si può utilizzare PropertyPlaceHolderConfigurer per impostare il valore di NameOfBeanConfigFile.

    Mi piace questo approccio, significa che posso mix statico bean config nomi di file con dinamica bean config nomi di file e di conseguenza non devono duplicare bean config.

    Quando ho dovuto fare una cosa simile, vorrei parameterise tramite un file di configurazione caricato come una risorsa URL (via jndi)

  2. 2

    ci sono 4 parti per la mia soluzione. primo, in web.xml la mia applicazione ho definiscono i seguenti:

    <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
    
        <context-param>
            <param-name>contextConfigLocation1</param-name>
            <param-value>classpath:applicationContext-1.xml</param-value>
        </context-param>
    
        <context-param>
            <param-name>contextConfigLocation2</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
    
        <listener>
            <listener-class>com.my.package.MyContextLoaderListener</listener-class>
        </listener>

    Poi ho estendere ContextLoaderListener

    package com.my.package;
    
    import org.springframework.web.context.ContextLoader;
    import org.springframework.web.context.ContextLoaderListener;
    
    public class MyContextLoaderListener extends ContextLoaderListener {
        @Override
        protected ContextLoader createContextLoader() {
            return new MyContextLoader();
        }
    }

    e ContextLoader

    package com.my.package;
    
    import javax.servlet.ServletContext;
    
    import org.springframework.web.context.ConfigurableWebApplicationContext;
    import org.springframework.web.context.ContextLoader;
    
    public class LnvContextLoader extends ContextLoader {
    
        private static final String APP_CONTEXT_PROP = "MY_CONTEXT_LOAD_PARAM";
    
        @Override
        protected void customizeContext(ServletContext servletContext,
                ConfigurableWebApplicationContext wac) {
    
            //check for system property first, if not defined, check for env variable
            String appContextParam = System.getProperty(APP_CONTEXT_PROP);
            if(appContextParam==null)
            {
                appContextParam = System.getenv(APP_CONTEXT_PROP);
            }
    
    
            if(appContextParam!=null && !appContextParam.equals("")){
    
                String initParam = servletContext.getInitParameter(appContextParam);
    
                wac.setConfigLocation(initParam);
            }
    
    
        }
    }

    e, infine, nel mio tomcat avvio, posso definire la variabile di ambiente in setenv.bat

    set MY_CONTEXT_LOAD_PARAM=contextConfigLocation1

    questa soluzione carichi da una variabile di ambiente, ma il codice è flessibile e permette di impostare in una proprietà del sistema, invece.

  3. -2

    Se si carica l’applicazione di contesto, attraverso il percorso di classe, è possibile ignorare che l’immissione di un’altra versione del applicationContext.xml nel server classpath.

    La mia soluzione sarebbe molto semplice applicationContext, che include il reale ambito di applicazione :

    applicationContext.xml :

    <beans>
        <import resource="classpath:realContext.xml"/>
    </beans>

    Se vuoi un altro contesto, aggiungere un applicationContext.xml per il vostro server classpath con :

    <beans>
        <import resource="classpath:realContext2.xml"/>
    </beans>

    E hanno realContext.xml e realContext2.xml confezionato nella tua GUERRA. Nessun bisogno di fantasia contesto ascoltatore.

    Solo la mia opinione, ma ho molto antipatia per Guerre che non sono autonomi. Io la trovo molto comoda per avere una singola unità di deployement. Preferisco creare 2 versioni differenti di la mia GUERRA durante il processo di generazione, uno per ogni configurazione necessaria.

    Un’altra soluzione, se si desidera caricare un altro bean in base a una data proprietà, è possibile utilizzare un PropertyPlaceholderConfigurer e mettere il nome del bean come una proprietà :

    <beans>
      <bean id="bean1" .../>
      <bean id="bean2" .../>
      <bean id="otherBean">
        <property name="injectDifferentBean" ref="${property.containing.bean.name" />
      </bean>
    </beans>

    e una proprietà di file con :

    property.containing.bean.name=bean1

    o

    property.containing.bean.name=bean2

Lascia un commento