2014-01-29 126 views
1

我正在嘗試獲取Bean類名稱而不初始化bean。 我需要知道這個類,我可以從applicationContext中獲取bean,並從bean實例中檢查類名,但是我想知道該類實際上是否創建了/ init這個bean .. 是否有可能?Spring bean定義 - 獲取bean類

Object bean = applicationContext.getBean("beanName"); 
bean.getClass(); 

回答

2

創建ApplicationContext後無法執行此操作。大多數ApplicationContext實現將自己和refresh()本身並強制bean的實例化。

你可以做的是創建一個BeanFactoryPostProcessor,在其中獲得目標bean定義並檢查bean類。

@Override 
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
    String className = beanFactory.getBeanDefinition("").getBeanClassName(); 
} 

但是要注意,作爲的Javadoc getBeanClassName()狀態

因此,並不認爲這是在運行時 明確的bean類型,而是隻用它在各個豆 解析目的定義級別。

因此,使用它與一粒鹽。


如果您向我們提供有關您要完成的任務的更多詳細信息,可能會有其他選擇。

1

由Sotirious提供的代碼不會對具有母體豆的豆類和對於使用的Java Config或使用@Component註釋(以及類似annotatios像@Service@Repository@Component)中定義的豆工作。

@Override 
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
    for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) { 
     String beanClassName = getBeanClassName(beanDefinitionName, beanFactory); 
    } 
} 

private String getBeanClassName(String beanName, ConfigurableListableBeanFactory beanFactory) { 
    String beanClassName; 
    BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); 
    if (beanDefinition instanceof AnnotatedBeanDefinition) { 
     AnnotationMetadata metadata = ((AnnotatedBeanDefinition) beanDefinition).getMetadata(); 
     beanClassName = metadata.getClassName(); 
    } else { 
     beanClassName = beanDefinition.getBeanClassName(); 
     while (beanClassName == null) { 
      BeanDefinition parentBeanDefinition = beanFactory.getBeanDefinition(beanDefinition.getParentName()); 
      beanClassName = parentBeanDefinition.getBeanClassName(); 
      beanDefinition = parentBeanDefinition; 
     } 
    } 

    return beanClassName; 
} 

注意,這種方法不會在錶殼廠工作方法使用:

只是一個用來檢查是否是AnnotatedBeanDefinition或者如果bean有父擴展。正如Java Doc所說:

此外,這可能只是一個工廠方法被調用的類,或者在調用方法的工廠bean引用的情況下它甚至可能是空的。因此,而不是認爲這是運行時的權威bean類型,而只是將其用於各個bean定義級別的解析目的。