код предоставляется 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-компонента во время выполнения, а скорее использует его только для синтаксического анализа на уровне определения отдельного компонента.