Как проверить, был ли подключен экземпляр компонента?

1

Я создаю небольшую структуру, которая предоставляет некоторые abstract базовые классы, которые должны быть реализованы при использовании библиотеки.

Как создать процедуру проверки, которая проверяет, действительно ли все классы были реализованы?

Я думал, что могу использовать @ConditionalOnMissingBean весенней загрузки, но это ничего не делает. Во всяком случае, моя цель:

@Configuration
@EnableAutoConfiguration
public class AppCfg {
    @ConditionalOnMissingBean(BaseCarService.class) //stupid exmaple
    public void validate() {
        System.out.println("MISSING BEAN!!");
    }
}

//must be implemented
public abstract BaseCarService {

}

Как я могу это достичь?

  • 0
    @ConditionalOnMissingBean вообще не запускается, когда бин не существует?
  • 0
    Нет, совсем нет, нет выхода.
Показать ещё 1 комментарий
Теги:
spring-boot
spring

3 ответа

1
Лучший ответ

Вы можете выполнить этот вызов ApplicationContext.getBeansOfType(BaseCarService.class) когда ваш контекст был инициализирован (например, из bean, который реализует ContextLoaderListener), то есть примерно следующее:

public class BeansValidator impelements ContextLoaderListener {
    public void contextInitialized(ServletContextEvent event) {
         if (ApplicationContext.getBeansOfType(BaseCarService.class).isEmpty()) {
               // print log, throw exception, etc 
         }
    }
}
  • 0
    Что если я не в веб-приложении, а просто в приложении локальной линии команд? Там не будет никакого ContextLoaderListener , ни ApplicationContext .
  • 0
    Почему? ApplicationContext - самая простая вещь в Spring. Это фабрика, которая создает все компоненты и управляет экземплярами. Это весна. Так оно и есть.
Показать ещё 3 комментария
1

ApplicationListener можно использовать для доступа к контексту после запуска.

public class Loader implements ApplicationListener<ContextRefreshedEvent>{

    public void onApplicationEvent(ContextRefreshedEvent event) {

       if (event.getApplicationContext().getBeansOfType(BaseCarService.class).isEmpty()) {
           // print log, throw exception, etc 
       }
    }
0

Следующие будут работать, но выглядит немного неудобно, если вы просто собираетесь выбросить исключение:

@Configuration
@EnableAutoConfiguration
public class AppCfg {

    @ConditionalOnMissingBean(BaseCarService.class)
    @Bean
    public BaseCarService validate() {
       throw new NoSuchBeanDefinitionException("baseCarService"); //or do whatever else you want including registering a default bean
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню