2016-02-03 5 views
6

Есть ли программный способ узнать, какой класс конфигурации или XML-файл создал компонент Spring? Вместо того, чтобы выкапывать код, чтобы понять это.Есть ли программный способ узнать, как был создан компонент Spring?

+0

Однажды мне пришлось отлаживать подобный вопрос. Существует фаза, в которой Spring считывает определения бобов из разных источников. Вы можете поместить контрольные точки состояния в конструктор этих определений бобов и уловить момент, когда он был впервые создан. Затем вы увидите источник, перемещаясь вверху в стеке. – AdamSkywalker

+0

@AdamSkywalker Да, я надеялся, что будет более простой путь. – Glide

ответ

4

Ниже показано, как получить источник конфигурации с использованием имени компонента.

  1. Получить определение бина для компонента: ctx.getBeanDefinition ("beanName")
  2. Invoke getResourceDescription().

Ниже приведен рабочий пример, который устанавливает @Configuration на основе компонент под названием «а» определяется в AppConfig, и XML боб с именем «xmlBean» определено в SpringBeans.xml. В каждом случае корректно отображается исходный класс @Configuration или XML-файл.

Здесь находится класс конфигурации java, который устанавливает bean = a, а также загружает файл конфигурации XML SpringBeans.xml, содержащий bean = xmlBean.

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

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

} 

Здесь фасоли определено в SpringBeans.xml:

<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()); 
    } 

} 
Смежные вопросы