4

我正在尝试获取 Bean 类名而不初始化 bean。我需要知道类,我可以从 applicationContext 获取 bean 并从 bean 实例检查类名,但我想知道类而不实际创建/初始化 bean.. 可能吗?

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

2 回答 2

3

创建ApplicationContext. 大多数ApplicationContext实现将refresh()自己并强制实例化 bean。

您可以做的是创建一个BeanFactoryPostProcessor在其中获取目标 bean 定义并检查 bean 类的方法。

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

但请注意,作为getBeanClassName()州的 javadoc

因此,不要认为这是运行时确定的 bean 类型,而只是在单个 bean 定义级别将其用于解析目的。

所以用一粒盐。


如果您向我们提供有关您要完成的工作的更多详细信息,则可能会有其他选择。

于 2014-01-29T15:42:46.047 回答
1

Sotirious 提供的代码不适用于具有父 bean 的 bean 以及使用 Java Config 或使用@Component注解(以及类似的注解,如@Service@Repository@Component)定义的 bean。

只是一个扩展,它检查它是否是AnnotatedBeanDefinition或者 bean 是否有父级:

@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所说:

此外,这可能只是调用工厂方法的类,或者在调用方法的工厂 bean 引用的情况下它甚至可能是空的。因此,不要认为这是运行时确定的 bean 类型,而只是在单个 bean 定义级别将其用于解析目的。

于 2017-03-15T23:26:39.067 回答