在大型企业系统中,并不总是清楚在ApplicationContext构造期间导入哪些文件。 有没有办法列出在此过程中加载的所有文件? 我知道如何列出加载的属性文件,但不知道导入的bean文件。
使用示例进行更新:
文件1:applicationContext.xml包含行:
<import resource="classpath*:importableBeans1.xml" />
文件2:importableBeans1.xml包含行:
<import resource="classpath*:importableBeans2.xml" />
<import resource="classpath*:importableBeans3.xml" />
文件3:importableBeans2.xml包含一些bean定义。 文件4:importableBeans3.xml包含一些bean定义。
加载ApplicationContext后,我希望能够在控制台中打印这样的内容:
applicationContext.xml
importableBeans1.xml
importableBeans2.xml
importableBeans3.xml
答案 0 :(得分:2)
开始ClassPathXmlApplicationContext
或更多AbstractXmlApplicationContext
时,XmlBeanDefinitionReader
将用于加载您的xml文件。
每次加载xml文件时,准确 加载之前,你都会得到loadBeanDefinitions(EncodedResource encodedResource)
的日志(信息):
if (logger.isInfoEnabled()) {
logger.info("Loading XML bean definitions from " + encodedResource.getResource());
}
如果您不能依赖此信息,则可以使用ReaderEventListener
:
public class TrackingImportXmlApplicationContext extends ClassPathXmlApplicationContext {
private static final TrackingImportReaderEventListener trackingImportReaderEventListener = new TrackingImportReaderEventListener();
public TrackingImportXmlApplicationContext(String configLocation) {
super(configLocation);
}
public TrackingImportXmlApplicationContext(String... configLocations) {
super(configLocations);
}
@Override
protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
super.initBeanDefinitionReader(reader);
reader.setEventListener(trackingImportReaderEventListener);
}
public TrackingImportReaderEventListener getTrackingImportReaderEventListener() {
return trackingImportReaderEventListener;
}
public static class TrackingImportReaderEventListener extends EmptyReaderEventListener {
private final Set<String> imports = new HashSet<>();
@Override
public void importProcessed(ImportDefinition importDefinition) {
imports.add(importDefinition.getImportedResource());
}
public Set<String> getImports() {
return imports;
}
}
}
然后:
public class Main {
public static void main(String[] args) {
TrackingImportXmlApplicationContext applicationContext = new TrackingImportXmlApplicationContext("/META-INF/applicationContext.xml");
TrackingImportXmlApplicationContext.TrackingImportReaderEventListener tracking = applicationContext.getTrackingImportReaderEventListener();
for (String _import : tracking.getImports()) {
System.out.println(" >>> imported : " + _import);
}
}
}
在以后的解决方案中,您只会导入文件,但当然您已经知道了您的初始xml文件