2014-09-10 2 views
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' не запускается вообще, когда компонента не существует? – geoand

+0

Нет, совсем нет выхода. – membersound

+0

'@ ConditionalOnMissingBean' имеет значение« использовать этот компонент (или конфигурацию), если отсутствует бит X ». Так что это полезно только в сочетании с компонентами или конфигурациями. – zeroflagL

ответ

1

Вы можете сделать это позвонив ApplicationContext.getBeansOfType(BaseCarService.class), когда ваш контекст инициализирована (например, из фасоли, который реализует 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'. – membersound

+0

Почему? «ApplicationContext» - самая простая вещь весной. Это фабрика, которая создает все бобы и управляет экземплярами. Это Весна. Таким образом, он всегда существует. – AlexR

+0

Итак, я должен пойти с @PostConstruct или есть класс, похожий на 'ContextLoaderListener'? – membersound

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 
    } 
} 
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 
     } 
    }