version: 5.2.12.RELEASE Expect: StackOverflowError or BeanCreationException But: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.beans.factory.BeanCreationException
@Configuration
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Test.class);
System.out.println(context.getBean("aaa"));
}
@Component("aaa")
static class A implements FactoryBean<String>, BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public String getObject() throws Exception {
beanFactory.getBean("aaa");
return "sss";
}
@Override
public Class<?> getObjectType() {
return String.class;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}
}
Comment From: AvengerEug
First, The main function of context.getBean("aaa")
code is to obtain the beans maintained internally by factorybean that is "sss". If You call it again in getObject that will occur loop recursion. finally, it cause method call stack memory overflow.
So, you can't call it in getObject again.
Comment From: snicoll
Expect: StackOverflowError or BeanCreationException But: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.beans.factory.BeanCreationException
Running your sample with a supported version of the framework, I get:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'aaa': FactoryBean threw exception on object creation
... 1024 more
Caused by: java.lang.StackOverflowError
at java.base/java.lang.Module.implIsExportedOrOpen(Module.java:618)
at java.base/java.lang.Module.isExported(Module.java:530)
at java.base/sun.invoke.util.VerifyAccess.isModuleAccessible(VerifyAccess.java:262)
at java.base/sun.invoke.util.VerifyAccess.isClassAccessible(VerifyAccess.java:230)
at java.base/sun.invoke.util.VerifyAccess.isMemberAccessible(VerifyAccess.java:104)
at java.base/java.lang.invoke.MethodHandles$Lookup.checkAcces
Sorry this got overlooked.