Я создаю небольшую структуру, которая предоставляет некоторые 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 {
}
Как я могу это достичь?
Вы можете выполнить этот вызов 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
}
}
}
ContextLoaderListener
, ни ApplicationContext
.
ApplicationContext
- самая простая вещь в Spring. Это фабрика, которая создает все компоненты и управляет экземплярами. Это весна. Так оно и есть.
ApplicationListener можно использовать для доступа к контексту после запуска.
public class Loader implements ApplicationListener<ContextRefreshedEvent>{
public void onApplicationEvent(ContextRefreshedEvent event) {
if (event.getApplicationContext().getBeansOfType(BaseCarService.class).isEmpty()) {
// print log, throw exception, etc
}
}
Следующие будут работать, но выглядит немного неудобно, если вы просто собираетесь выбросить исключение:
@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
}
}
@ConditionalOnMissingBean
вообще не запускается, когда бин не существует?