我正在尝试获取 Bean 类名而不初始化 bean。我需要知道类,我可以从 applicationContext 获取 bean 并从 bean 实例检查类名,但我想知道类而不实际创建/初始化 bean.. 可能吗?
Object bean = applicationContext.getBean("beanName");
bean.getClass();
我正在尝试获取 Bean 类名而不初始化 bean。我需要知道类,我可以从 applicationContext 获取 bean 并从 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();
}
但请注意,作为getBeanClassName()
州的 javadoc
因此,不要认为这是运行时确定的 bean 类型,而只是在单个 bean 定义级别将其用于解析目的。
所以用一粒盐。
如果您向我们提供有关您要完成的工作的更多详细信息,则可能会有其他选择。
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 定义级别将其用于解析目的。