我正在创建一个小框架,它提供了一些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 {
}
我怎样才能做到这一点?
当您的上下文已经初始化(例如,从实现ContextLoaderListener
的bean)时,您可以调用ApplicationContext.getBeansOfType(BaseCarService.class)
来完成此操作,例如如下所示:
public class BeansValidator impelements ContextLoaderListener {
public void contextInitialized(ServletContextEvent event) {
if (ApplicationContext.getBeansOfType(BaseCarService.class).isEmpty()) {
// print log, throw exception, etc
}
}
}
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
}
}