如何列出所有加载的Spring bean定义文件

时间:2015-09-22 18:33:30

标签: java spring

在大型企业系统中,并不总是清楚在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

1 个答案:

答案 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文件