有没有一种编程方式可以找出 Spring bean 是如何创建的?
Is there a programmatic way to find out how a Spring bean was created?
是否有编程方式找出哪个配置 class 或 xml 文件创建了 Spring bean?而不是挖掘代码来弄清楚。
下面演示如何通过bean名获取配置源。
- 获取bean的bean定义:ctx.getBeanDefinition("beanName")
- 调用 getResourceDescription()。
下面是一个工作示例,它设置了一个在 AppConfig 中定义的名为 'a' 的基于 @Configuration 的 bean,以及一个在 SpringBeans.xml 中定义的名为 "xmlBean" 的 XML bean。在每种情况下,源@Configuration class 或 xml 文件都会正确显示。
这里是设置 bean=a 的 java 配置 class,同时加载包含 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();
}
}
这里是SpringBeans.xml中定义的bean:
<bean id="xmlBean" class="com.test.HelloWorld">
<property name="name" value="XML" />
</bean>
这是使用 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());
输出:
Creation class for a=com.test.config.AppConfig
Creation XML file for xmlBean=class path resource [SpringBeans.xml]
可能更实用的方法是创建一个 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());
}
}
是否有编程方式找出哪个配置 class 或 xml 文件创建了 Spring bean?而不是挖掘代码来弄清楚。
下面演示如何通过bean名获取配置源。
- 获取bean的bean定义:ctx.getBeanDefinition("beanName")
- 调用 getResourceDescription()。
下面是一个工作示例,它设置了一个在 AppConfig 中定义的名为 'a' 的基于 @Configuration 的 bean,以及一个在 SpringBeans.xml 中定义的名为 "xmlBean" 的 XML bean。在每种情况下,源@Configuration class 或 xml 文件都会正确显示。
这里是设置 bean=a 的 java 配置 class,同时加载包含 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();
}
}
这里是SpringBeans.xml中定义的bean:
<bean id="xmlBean" class="com.test.HelloWorld">
<property name="name" value="XML" />
</bean>
这是使用 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());
输出:
Creation class for a=com.test.config.AppConfig
Creation XML file for xmlBean=class path resource [SpringBeans.xml]
可能更实用的方法是创建一个 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());
}
}