2016-02-03 11 views
6

Czy istnieje programowy sposób sprawdzenia, która klasa konfiguracji lub plik xml utworzył komponent Spring bean? Zamiast przeszukiwać kod, aby go rozgryźć.Czy istnieje programowy sposób sprawdzania, w jaki sposób został utworzony komponent Spring bean?

+0

Kiedyś miałem podobny problem do debugowania. Istnieje faza, w której Spring czyta definicje fasoli z różnych źródeł. Możesz umieścić warunki przerwania w konstruktorze definicji tego komponentu i uchwycić moment, w którym został utworzony pierwszy. Wtedy zobaczysz źródło, przesuwając górną część w stosie. – AdamSkywalker

+0

@AdamSkywalker Tak, miałem nadzieję, że będzie łatwiejszy sposób. – Glide

Odpowiedz

4

Poniżej przedstawiono sposób uzyskiwania źródła konfiguracji przy użyciu nazwy komponentu bean.

  1. Uzyskanie definicji fasoli dla Fasola: ctx.getBeanDefinition ("beanName")
  2. Invoke getResourceDescription().

Poniżej znajduje się przykład pracy, który ustawia komponent bean oparty na konfiguracji @Configuration o nazwie "a" zdefiniowany w AppConfig oraz komponent bean XML o nazwie "xmlBean" zdefiniowany w pliku SpringBeans.xml. W każdym przypadku klasa źródłowa @Configuration lub plik xml jest wyświetlany poprawnie.

Oto klasa konfiguracyjna java, która konfiguruje komponent bean = a, a także ładuje plik konfiguracyjny XML SpringBeans.xml zawierający komponent bean = xmlBean.

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

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

} 

Oto fasoli zdefiniowano w SpringBeans.xml:

<bean id="xmlBean" class="com.test.HelloWorld"> 
    <property name="name" value="XML" /> 
</bean> 

Oto prosty kod, który wykorzystuje 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()); 

wyjściowa:

Creation class for a=com.test.config.AppConfig 
Creation XML file for xmlBean=class path resource [SpringBeans.xml] 

Prawdopodobnie bardziej praktyczny sposób jest stworzenie BeanDefinitionRegistryPostProcessor i zażądać informacji tam:

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

} 
Powiązane problemy