2014-01-29 7 views
1

Я пытаюсь получить имя класса Bean без инициализации компонента. Мне нужно знать класс, я мог бы получить bean-компонент из applicationContext и проверить имя класса из экземпляра bean, но я хочу знать класс с фактическим созданием/init bean. Возможно ли это?Spring bean definition - get bean class

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

ответ

2

Вы не можете сделать это после создания ApplicationContext. Большинство реализаций ApplicationContext составят refresh() и создадут экземпляр боба.

Что вы можете сделать, это создать BeanFactoryPostProcessor, в котором вы получите определение целевого компонента и проверьте класс bean.

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

Но обратите внимание, как Javadoc для getBeanClassName() состояний

Следовательно, не считаю, что это окончательный вид боба во время выполнения , а только использовать его для разбора целей на индивидуальном компоненте уровень определения.

Так используйте его с солью.


Если вы дадите нам более подробную информацию о том, что вы пытаетесь выполнить, могут быть альтернативы.

1

код предоставляется Sotirious не будет работать для бобов, которые имеют родительские бобы и фасоль, которые определяются с помощью Java Config или с помощью @Component аннотацию (и подобного annotatios как @Service, @Repository, @Component).

Просто расширение, которое проверяет, если он AnnotatedBeanDefinition или если боб имеет родителя:

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

Примечание, этот подход не будет работать в методе случае фабричного используется. Как говорит Java Doc:

Кроме того, это может быть просто класс, на который вызван заводский метод, или он может даже быть пустым в случае ссылки на фабричный компонент, в котором вызывается метод. Следовательно, do не считает это окончательным типом bean-компонента во время выполнения, а скорее использует его только для синтаксического анализа на уровне определения отдельного компонента.