如何在运行时在spring中加载其他bean配置文件

时间:2014-12-20 13:45:45

标签: spring

我有一个spring应用程序,将来我们将开发更多类,对于这些类,我们还将使用其他配置文件(不会覆盖现有的)来定义bean。那么如何动态加载它们呢?我知道ApplicationContextAware有一个接口,我可以运行一个bean来检查新的配置文件是否可用,如果它们来了,我可以运行

setApplicationContext(ApplicationContext applicationContext)

但是如何使用ApplicationContext加载其他配置文件?

更新 如果从XML加载应用程序然后我可以将ApplicationContext转换为ClassPathXmlApplicationContext然后使用加载方法,但是如果AnnotationConfigApplicationContext,它只有扫描方法来扫描包,但是如果我想从xml加载怎么办?

更新 以下是我想要使用的代码,它使用spring集成来监视折叠,在运行时我可以将jar文件放在类路径上,然后将xml配置放在该文件夹中,这将触发loadAdditionBeans函数运行,并且将传入xml File对象,需要做的是将该File中的上下文添加到当前上下文但不创建子上下文。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.integration.annotation.MessageEndpoint;
import org.springframework.integration.annotation.ServiceActivator;

import java.io.File;

@MessageEndpoint
public class FolderWatcher implements ApplicationContextAware {
    //private ApplicationContext ctx;
    private AnnotationConfigApplicationContext ctx;  // it's a spring boot,so the ctx is AnnotationConfigApplicationContext
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.ctx=(AnnotationConfigApplicationContext)applicationContext;
    }
    @ServiceActivator
    public void loadAdditionBeans(File file){
        /*
        file is an xml configuration file, how to load the beans defined it into the currect context,
        I don't what to have another hierarchy, since that will make the beans defined in the file not
        available in parent.
         */
    }

}

2 个答案:

答案 0 :(得分:8)

PathMatchingResourcePatternResolver pmrl = new PathMatchingResourcePatternResolver(context.getClassLoader());
  Resource[] resources = pmrl.getResources(
    "classpath*:com/mycompany/**/applicationContext.xml"
  );

for (Resource r : resources) {
   GenericApplicationContext createdContext = new GenericApplicationContext(context);
   XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(createdContext);
   int i = reader.loadBeanDefinitions(r);
}

看看上面的代码,让我知道它是否有助于解决您的问题。

答案 1 :(得分:0)

如果您正在使用类路径扫描,但仍希望从XML加载其他配置,则只需在@ImportResource类上使用@Configuration注释并导入所需的XML资源: @Configuration @ImportResource( { "classpath*:/rest_config.xml" } ) public class MyConfig{ ... } 这样就可以很容易地将旧版XML配置与较新的Java配置混合使用,而且您不必 - 例如 - 一次性迁移整个配置。

希望有所帮助。