2014-01-29 3 views
1

bean을 초기화하지 않고 get Bean 클래스 이름을 시도하고있다. 클래스를 알아야하는데, applicationContext에서 bean을 가져올 수 있고 bean 인스턴스에서 클래스 이름을 확인할 수 있습니다.하지만 bean을 실제로 생성/초기화하지 않고 클래스를 알고 싶습니다. 가능합니까?봄 bean 정의 - bean 클래스 얻기

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

답변

2

ApplicationContext을 만든 후에는이 작업을 수행 할 수 없습니다. 대부분 ApplicationContext 구현은 refresh()이 될 것이고 빈의 인스턴스화를 강제 할 것이다.

당신이 할 수있는 일은 대상 빈 정의를 얻고 빈 클래스를 확인하는 BeanFactoryPostProcessor을 생성하는 것입니다.

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

그러나 참고

,

따라서 getBeanClassName() 상태

를위한 Javadoc로, 실행 에서 최종 콩 종류가 수 있도록이 고려하지 않는 것이 아니라 단지 개인 콩 에 목적을 구문 분석을 위해 사용 정의 수준.

소금 한 알과 함께 사용하십시오.


달성하려는 목표에 대해 자세히 알려 주시면 다른 대안이있을 수 있습니다. Sotirious에서 제공

1

코드는 부모 콩이 콩과 자바 구성을 사용하거나 @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 또는 빈 부모가있는 경우 경우 확인

그냥 확장. Java Doc가 말하듯이 :

또한 이것은 factory 메소드가 호출되는 클래스 일 수도 있고 메소드가 호출 된 factory bean 참조의 경우 비어있을 수도 있습니다. 따라서 이 아닌은 런타임시이 유형을 최종 빈 유형으로 간주하지만 개별 빈 정의 수준에서 구문 분석 용으로 만 사용하십시오.