我正在嘗試獲取Bean類名稱而不初始化bean。 我需要知道這個類,我可以從applicationContext中獲取bean,並從bean實例中檢查類名,但是我想知道該類實際上是否創建了/ init這個bean .. 是否有可能?Spring bean定義 - 獲取bean類
Object bean = applicationContext.getBean("beanName");
bean.getClass();
我正在嘗試獲取Bean類名稱而不初始化bean。 我需要知道這個類,我可以從applicationContext中獲取bean,並從bean實例中檢查類名,但是我想知道該類實際上是否創建了/ init這個bean .. 是否有可能?Spring bean定義 - 獲取bean類
Object bean = applicationContext.getBean("beanName");
bean.getClass();
創建ApplicationContext
後無法執行此操作。大多數ApplicationContext
實現將自己和refresh()
本身並強制bean的實例化。
你可以做的是創建一個BeanFactoryPostProcessor
,在其中獲得目標bean定義並檢查bean類。
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String className = beanFactory.getBeanDefinition("").getBeanClassName();
}
但是要注意,作爲的Javadoc getBeanClassName()
狀態
因此,並不認爲這是在運行時 明確的bean類型,而是隻用它在各個豆 解析目的定義級別。
因此,使用它與一粒鹽。
如果您向我們提供有關您要完成的任務的更多詳細信息,可能會有其他選擇。
由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定義級別的解析目的。