Java 如何列出所有加载的Springbean定义文件
在大型企业系统中,在ApplicationContext构建过程中导入哪些文件并不总是很清楚。 是否有办法列出在该过程中加载的所有文件? 我知道如何列出加载的属性文件,但不知道如何列出导入的bean文件 更新示例: 文件1:applicationContext.xml包含以下行:Java 如何列出所有加载的Springbean定义文件,java,spring,Java,Spring,在大型企业系统中,在ApplicationContext构建过程中导入哪些文件并不总是很清楚。 是否有办法列出在该过程中加载的所有文件? 我知道如何列出加载的属性文件,但不知道如何列出导入的bean文件 更新示例: 文件1:applicationContext.xml包含以下行: <import resource="classpath*:importableBeans1.xml" /> <import resource="classpath*:importableBeans2
<import resource="classpath*:importableBeans1.xml" />
<import resource="classpath*:importableBeans2.xml" />
<import resource="classpath*:importableBeans3.xml" />
启动
ClassPathXmlApplicationContext
或更一般的AbstractXmlApplicationContext
时,将使用XmlBeanDefinitionReader
加载xml文件
每次加载xml文件时,准确地说,在加载之前,您都会从loadBeanDefinitions(EncodedResource EncodedResource)
获得一个日志(信息):
如果您不能依赖此信息,可以使用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;
}
}
}
在后面的解决方案中,您将只导入文件,但当然您已经知道初始xml文件。它由Spring容器管理,并且是按需创建的(对象在需要时创建)。为什么您需要知道这些?我需要查看在应用程序启动时加载了哪些文件。我不需要bean,只需要文件。你是说资源(比如.properties)文件还是像.java这样的任何文件?我用更多的信息更新了我的问题。我只想要xml文件。请看上面。
if (logger.isInfoEnabled()) {
logger.info("Loading XML bean definitions from " + encodedResource.getResource());
}
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);
}
}
}