2014-09-10 28 views
1

我正在創建一個小框架,它提供了一些abstract基類,這些基類在使用庫時必須實施。如何驗證bean實例是否已連線?

如何創建一個驗證例程來檢查是否確實實現了所有類?

我以爲我可以使用spring-boot的@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'在bean不存在時根本沒有被觸發? – geoand 2014-09-10 14:47:37

+0

完全沒有,沒有輸出。 – membersound 2014-09-10 19:45:27

+0

'@ ConditionalOnMissingBean'具有「如果缺少bean X就使用這個bean(或配置)」的含義。所以它只能與組件或配置結合使用。 – zeroflagL 2014-09-10 19:52:30

回答

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 2014-09-11 10:19:40

+0

爲什麼? 'ApplicationContext'是Spring中最基本的東西。這是創建所有bean和管理實例的工廠。這是春天。所以它一直存在。 – AlexR 2014-09-11 11:59:10

+0

好吧,我應該去@PostConstruct,或者是否有類似於'ContextLoaderListener'的類? – membersound 2014-09-11 12:46:39

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