从使用属性注入的xml中动态加载Bean

时间:2018-07-19 08:21:50

标签: java xml spring applicationcontext spring-bean

我需要从XML加载bean定义。该文件位于由属性配置的远程位置(http)。还应该从远程位置(Spring Cloud配置服务器)加载属性

约束:

  • 春季4.3.14(无法启动
  • 应该在运行时,并且之后我的属性已加载
  • xml中定义的
  • bean在上下文中引用属性
  • (从中获取xml的)
  • 服务器URI应该位于属性中,而不应位于环境变量或个人档案中

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加载到父应用程序上下文(已经存在),尽管它们已注入属性。

0 个答案:

没有答案