2015-09-22 33 views
3

在大型企业系统中,并不总是清楚在ApplicationContext构造期间哪些文件被导入。 有没有办法列出在这个过程中加载的所有文件? 我知道如何列出加载的属性文件,但不是导入的bean文件。如何列出所有加载的Spring 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

它由Spring容器管理并按需提供(当需要时创建对象) 。为什么你需要知道相同的? – Vish

+0

我需要查看哪些文件作为应用程序启动的一部分加载。我不需要豆,只是文件。 – ATrubka

+0

你的意思是资源(如.properties)文件或类似.java的文件吗? – Vish

回答

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

相关问题