2012-02-10 4 views
1

Есть ли способ обнаружить все Бинфактории, определенные Весной программно. Я хочу создать страницу отладки состояния, которая печатает имена и типы классов каждого компонента в контексте весеннего приложения, однако я не знаю, как получить список всех ApplicationContexts.Как перечислить все BeanFactories весной?

ответ

1

Код ниже является Spring слушателем, который может быть зарегистрирован в главном файле spring.xml для веб-приложения, он строит карту все контексты дочерних приложений и раскрывает эту карту как свойство. Класс ниже может быть введен в любой весенний боб, который ему нужен, используя @Autowired.

import java.util.Hashtable; 
import java.util.Map; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationListener; 
import org.springframework.context.event.ApplicationContextEvent; 
import org.springframework.context.event.ContextRefreshedEvent; 
import org.springframework.context.event.ContextStartedEvent; 

public class ContextsApplicationListener implements ApplicationListener<ApplicationContextEvent> { 

    private Map<String,ApplicationContext> contextMap = new Hashtable<String,ApplicationContext>(); 

    @Override 
    public void onApplicationEvent(ApplicationContextEvent event) { 
     if(event instanceof ContextStartedEvent || event instanceof ContextRefreshedEvent){ 
      this.getContextMap().put(event.getApplicationContext().getDisplayName(), event.getApplicationContext()); 
     } 

    } 

    public Map<String,ApplicationContext> getContextMap() { 
     return contextMap; 
    } 
} 

enter code here 
1

Вы можете подключить к BeanFactoryPostProcessor с вашим ApplicationContext, что позволит Вам пересекать BeanDefinition «S из проходной ConfigurableListableBeanFactory которые будут представлять все бобы из вашего ApplicationContext.

С этим экземпляром ConfigurableListableBeanFactory, вы можете найти все бобы типа (getBeansOfType()), или все бобы с данной аннотацией (getBeansWithAnnotation()), среди прочего.

+0

Должен ли я регистрировать BeanFactoryPostProcessor во всех контекстах моего приложения. Например, приложение имеет два контекста: основной файл spring.xml, инициализированный слушателем весеннего контекста, и другой, созданный с помощью сервлета диспетчера весны. – ams

+0

. Его нужно только добавить к одному из них. –

+0

@ams Я был неправ. Для 'BeanFactoryPostProcessor', вам нужно сделать один для каждого контекста приложения. Читайте здесь для получения дополнительной информации: http://www.dotkam.com/2008/07/09/spring-web-application-context-visibility/ –

1

Вы можете использовать ApplicationContext для этого.

 @Component 
     public class PrintSpringBeansInContext implements ApplicationContextAware 
    { 

    private ApplicationContext applicationContext; 

     @Override 
    public void setApplicationContext(ApplicationContext applicationContext) 
     throws BeansException 
    { 

     this.applicationContext = applicationContext; 
    } 


     public void print() 
    { 
     String[] beanNames = this.applicationContext.getBeanDefinitionNames(); 
     StringBuilder printBuilder = new StringBuilder("Spring Beans In Context: ");; 
    for(String beanName : beanNames) 
    { 
     printBuilder.append("\n"); 
     printBuilder.append(" Bean Name: "); 
     printBuilder.append(beanName); 
     printBuilder.append(" Bean Class: "); 
      printBuilder.append(this.applicationContext.getBean(beanName).getClass()); 
    } 
    System.out.println(printBuilder.toString()); 
} 

}

Вы можете проверить это

@ContextConfiguration(locations={"classpath:context.xml"}) 
    @RunWith(SpringJUnit4ClassRunner.class) 
    public class PrintContextTest 
    { 

    @Autowired 
    private PrintSpringBeansInContext service; 

    @Test 
    public void printBeans() 
    { 
      Assert.assertNotNull(service); 
      service.print(); 
    } 
} 
+0

Но как мне заставить его работать во всех контекстах, я знаю, что там по крайней мере, два в моей системе, первичный и тот, который создается диспетчером весеннего mvc-диспетчера. – ams

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