Есть ли способ обнаружить все Бинфактории, определенные Весной программно. Я хочу создать страницу отладки состояния, которая печатает имена и типы классов каждого компонента в контексте весеннего приложения, однако я не знаю, как получить список всех ApplicationContexts.Как перечислить все BeanFactories весной?
ответ
Код ниже является 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
Вы можете подключить к BeanFactoryPostProcessor
с вашим ApplicationContext
, что позволит Вам пересекать BeanDefinition
«S из проходной ConfigurableListableBeanFactory
которые будут представлять все бобы из вашего ApplicationContext
.
С этим экземпляром ConfigurableListableBeanFactory
, вы можете найти все бобы типа (getBeansOfType()
), или все бобы с данной аннотацией (getBeansWithAnnotation()
), среди прочего.
Вы можете использовать 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();
}
}
Но как мне заставить его работать во всех контекстах, я знаю, что там по крайней мере, два в моей системе, первичный и тот, который создается диспетчером весеннего mvc-диспетчера. – ams
- 1. Как перечислить и инициализировать бобы весной/jsf
- 2. Как перечислить все решения?
- 3. AssetsLibrary, как перечислить все фотографии?
- 4. Как перечислить все профили minecraft
- 5. Как рекурсивно перечислить все каталоги?
- 6. Как перечислить все свойства класса
- 7. Как перечислить все элементы приложения?
- 8. Как перечислить все теги Git?
- 9. Как перечислить все всплывающие окна?
- 10. Как перечислить все отлаживаемые приложения?
- 11. Перечислить все открытые соединения
- 12. Перечислить все возможные символы
- 13. перечислить все IEnumerables
- 14. Перечислить все свойства ViewData.Model
- 15. Перечислить все маркеры карт
- 16. Как перечислить на основе двух объектов весной jdbctemplate
- 17. Перечислить все значения из подраздела
- 18. WPF - FrameworkElement - Перечислить все подделки?
- 19. Перечислить все запущенные базы данных
- 20. Перечислить все флажки в PHP
- 21. Как перечислить все запущенные экземпляры CLR
- 22. Как перечислить все объекты в ООП
- 23. Как перечислить все сеансы в nodejs + express?
- 24. Как перечислить все выполняемые процессы mongod?
- 25. Как перечислить все позиции переменной в списке?
- 26. Как перечислить все модели, принадлежащие другой модели?
- 27. Как перечислить все переменные класса в swift
- 28. Как перечислить все методы S4, реализованные пакетом?
- 29. Как перечислить все серверные загрузочные серверы Kafka
- 30. как перечислить все теги XML в node.js
Должен ли я регистрировать BeanFactoryPostProcessor во всех контекстах моего приложения. Например, приложение имеет два контекста: основной файл spring.xml, инициализированный слушателем весеннего контекста, и другой, созданный с помощью сервлета диспетчера весны. – ams
. Его нужно только добавить к одному из них. –
@ams Я был неправ. Для 'BeanFactoryPostProcessor', вам нужно сделать один для каждого контекста приложения. Читайте здесь для получения дополнительной информации: http://www.dotkam.com/2008/07/09/spring-web-application-context-visibility/ –