是否有一种编程方式来了解如何创建Spring bean?

Gli*_*ide 7 java spring configuration-files

是否有一种编程方式来找出哪个Configuration类或xml文件创建了一个Spring bean?而不是挖掘代码来弄清楚.

Ian*_* Mc 5

下面演示如何使用bean名称获取配置的来源。

  1. 获取 bean 的 bean 定义:ctx.getBeanDefinition("beanName")
  2. 调用getResourceDescription()

下面是一个工作示例,它设置了一个在 AppConfig 中定义的名为“a”的基于 @Configuration 的 bean,以及一个在 SpringBeans.xml 中定义的名为“xmlBean”的 XML bean。在每种情况下,源 @Configuration 类或 xml 文件都会正确显示。

这是设置 bean=a 的 java 配置类,并加载包含 bean=xmlBean 的 XML 配置文件 SpringBeans.xml。

@Configuration
@ImportResource({"classpath:SpringBeans.xml"})
@ComponentScan(basePackages = "com.test.config")
public class AppConfig {

    @Bean
    public A a() {
        return new A();
    }

}
Run Code Online (Sandbox Code Playgroud)

这是 SpringBeans.xml 中定义的 bean:

<bean id="xmlBean" class="com.test.HelloWorld">
    <property name="name" value="XML" />
</bean>
Run Code Online (Sandbox Code Playgroud)

这是使用 getResourceDescription() 的简单代码:

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();

    ctx.register(AppConfig.class);
    ctx.refresh();

    BeanDefinition javaConfigBeanDefinition = ctx.getBeanDefinition("a");
    System.out.println("Creation class for a=" + javaConfigBeanDefinition.getResourceDescription());

    BeanDefinition xmlBeanDefinition = ctx.getBeanDefinition("xmlBean");
    System.out.println("Creation XML file for xmlBean=" + xmlBeanDefinition.getResourceDescription());
Run Code Online (Sandbox Code Playgroud)

输出:

Creation class for a=com.test.config.AppConfig
Creation XML file for xmlBean=class path resource [SpringBeans.xml]
Run Code Online (Sandbox Code Playgroud)

可能更实用的方法是创建一个BeanDefinitionRegistryPostProcessor并在那里请求信息:

@Component
public class FindBeanConfigLocation implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
    }

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        BeanDefinition javaConfigBeanDefinition = registry.getBeanDefinition("a");
        System.out.println("Creation class for a=" + javaConfigBeanDefinition.getResourceDescription());

        BeanDefinition xmlBeanDefinition = registry.getBeanDefinition("xmlBean");
        System.out.println("Creation XML file for xmlBean=" + xmlBeanDefinition.getResourceDescription());
    }

}
Run Code Online (Sandbox Code Playgroud)