如何验证bean实例是否已连接



我正在创建一个小框架,它提供了一些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
    }
}

最新更新