找到哪个spring上下文文件加载了bean

时间:2012-05-16 18:05:48

标签: spring

它是一个很大的应用程序,有多个bean xml文件可以通过spring容器加载。

有一个bean(具有相同的id)被覆盖,不知何故。

有没有办法告诉spring记录哪个bean是从哪个.xml文件创建的?

1 个答案:

答案 0 :(得分:1)

您可以创建ReaderEventListener并记录它们。但是您需要覆盖initBeanDefinitionReaderListener设置XmlBeanDefinitionReader(我认为没有其他办法,但可能......)。

例如:

  public class LogReaderEventListener extends EmptyReaderEventListener {

    private static final Log log = LogFactory.getLog(LogReaderEventListener.class);

    @Override
    public void componentRegistered(ComponentDefinition componentDefinition) {

        log.info("Registered Component [" + componentDefinition.getName() + "]");
        for (BeanDefinition bd : componentDefinition.getBeanDefinitions()) {
            String name = bd.getBeanClassName();

            if (bd instanceof BeanComponentDefinition) {
                name = ((BeanComponentDefinition) bd).getBeanName();
            }
            log.info("Registered bean definition: [" + name + "]" + 
                    " from " + bd.getResourceDescription());
        }
    }


    public static void main (String[] args) {
        ClassPathXmlApplicationContext context = new LogXmlContext("applicationContext.xml");
        context.close();

    }

}

class LogXmlContext extends ClassPathXmlApplicationContext {

    public LogXmlContext(String configLocation) {
        super(configLocation);
    }

    @Override
    protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
        super.initBeanDefinitionReader(reader);
        reader.setEventListener(new LogReaderEventListener());
    }

}