Hay una manera más elegante en la que puede usar un archivo xml externo y cargarlo con el recurso del sistema de archivos, luego inyectar los beans configurados en el contexto de la aplicación. Por lo tanto:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Service;
@Service
@Order(-100)
public class XmlBeanInitializationService implements ApplicationContextAware, InitializingBean {
private ApplicationContext applicationContext;
@Value("${xmlConfigFileLocation}")
private String xmlConfigFileLocation;
@Override
public void afterPropertiesSet() throws Exception {
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader((BeanDefinitionRegistry)applicationContext);
reader.loadBeanDefinitions(new FileSystemResource(xmlConfigFileLocation));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
donde $ {} xmlConfigFileLocation es una propiedad especificada en el archivo de application.properties que apunta a la ubicación del archivo en su sistema así:
xmlConfigFileLocation="your-file-path-anywhere-in-your-system"
y el archivo XML puede contener:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.yourpackage.YourBean1Class"></bean>
<bean class="com.yourpackage.YourBean2Class"></bean>
<bean class="com.yourpackage.YourBean3Class"></bean>
</beans>
por lo tanto, cuando su aplicación comienza la primavera carga la clase y carga el frijol en el contexto de la aplicación.
Espero que esto ayude a alguien.
Buena solución. Aprendo algo nuevo sobre Spring todos los días. – Patrick
+1 maravillosa solución. –
¡Me salvaste la vida! Utilicé 'MockServletContext sc = new MockServletContext(); \t \t sc.addInitParameter (ContextLoader.CONFIG_LOCATION_PARAM, "/applicationContext-test.xml"); \t \t nuevo ContextLoader(). InitWebApplicationContext (sc); 'para que funcione a través de' ContextLoader.getCurrentWebApplicationContext() ' – qwertzguy