我有一个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.
*/
}
}
答案 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配置混合使用,而且您不必 - 例如 - 一次性迁移整个配置。
希望有所帮助。