如何知道spring项目中加载bean的资源



我是spring框架的新手。我想知道加载bean时引用的xml文件的列表。

通过编写一个ApplicationContextAware类,我可以使用查看bean列表

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/sample-testcontext.xml")
public class SampleClass implements ApplicationContextAware {
    @Autowired
    ApplicationContext applicationContext;
    @Test
    public void testMethod() {
        for (String beanName : applicationContext.getBeanDefinitionNames()) {
            System.out.println("BeanName " + beanName);
        }
    }
}

但是我想知道bean是从哪个配置文件加载的。

假设"sampletestcontext.xml"包含

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

    <beans:import resource="classpath*:spring/sample-testOneMorecontext.xml"/>
</beans:beans>

我想知道从中加载beans的文件名列表,分别为"sampletestOneMorecontext.xml"one_answers"sampletestcontext.xml"。

为什么要这么做?我不确定一旦加载了上下文,内部实现是否会保存该信息的记录。但是,有一种方法可以知道从哪个资源加载了特定的bean。如果您有多个具有相同名称的bean定义,并且您想知道哪一个定义"赢了",那么这将非常有用。

举个例子(顺便说一句,你不需要实现ApplicationContextAware,因为你正在自动布线)

@ContextConfiguration
@ContextConfiguration("classpath:spring/sample-testcontext.xml")
public class SampleTest {
    @Autowired
    private ConfigurableApplicationContext context;
    @Test
    public void foo() {
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        for (String beanName : context.getBeanDefinitionNames()) {
            System.out.println(beanName + " --> "+  beanFactory.getBeanDefinition(beanName).getResourceDescription());
        }
    }
}

这为您提供了类似的东西(不包括默认实现可能自动注册的内部后处理器bean定义)

beanFirst --> class org.SampleTest$Config
beanSecond --> class path resource [foobar.xml]

其中beanFirst是从测试的内部类(称为Config)加载的,而beanSecond是从类路径根目录的名为foobar.xml的文件加载的。

相关内容

最新更新