我需要从XML加载bean定义。该文件位于由属性配置的远程位置(http)。还应该从远程位置(Spring Cloud配置服务器)加载属性
约束:
当MY_XML_URI
作为环境变量传递时,我当前的设置工作良好:
$ {SPRING_CONFIG_URI} / master / application-$ {spring.profiles.active} .properties
<import resource="${MY_XML_URI}/myBeans.xml"/>
在远程位置,myBeans.xml中有很多Bean,例如
<bean name="mySpecialBean" class="com.example.MyGenericBean">
<constructor-arg value="mySpecialBean"/>
<constructor-arg value="${special.bean.config.expression}"/>
</bean>
但是,当我想从属性上下文中获取MY_XML_URI
时,麻烦就开始了,但无法解决
…
我尝试了几种方法,例如:
带有@ImportResource({"${xml.server.uri}"})
的Java配置类
但尚未加载属性,因此无法将其转换为真实值xml.server.uri
。
@Configuration
@ImportResource({"${xml.server.uri:http://localhost:8888}/myBeans.xml"})
public class MyConfiguration {}
暴露出将xml作为资源获取并将其加载到父applicationContext的虚拟bean-我必须使它可用于依赖于xml中定义的那些bean的其他bean。此解决方案未将属性上下文注入到我的bean中,因此无法初始化它们。
@Configuration
public class RiskConfig {
@Value("${xml.server.uri}")
private String xmlUri;
@Autowired
@Bean
public Object myBean(ApplicationContext applicationContext) {
Resource resource = applicationContext.getResource(xmlUri + "myBeans.xml");
// not working since its not loading the beans to the main context
// GenericApplicationContext genericApplicationContext = new GenericApplicationContext(applicationContext);
// XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(genericApplicationContext);
// reader.loadBeanDefinitions(resource);
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) factory;
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(registry);
reader.loadBeanDefinitions(resource);
return new Object();
}
}
最后-有一种方法可以通过编程方式将Bean从xml加载到父应用程序上下文(已经存在),尽管它们已注入属性。