我有以下情况,我遇到空指针异常,因为bean没有初始化并导致我的服务器无法启动失败。 在PostConstruct注释方法中有一个新引入的调用失败。同一个调用正在另一个方法中进行,该方法不在PostConstruct中,它正确执行并且不会引起任何问题。
@Component
@Lazy
@Primary
class Parent{
@Autowired
private DesignContextService designContextService;
@PostConstruct
private void init(){
designContextService.getMethod();// fails
}
private void someFunction(){
designContextService.getMethod();// executes successfully
}
}
}
Class DesignContextService{
@Autowired
private ContextService contextService;
public void getMethod(){
contextService.isContextCreated();
...
}
// Below classes present in another jar
class ContextService{
@Inject
public ContextAdapter contextAdapter;
public void isContextCreated(){
contextAdapter.isEstablished();// contextAdapter is null . Throws exception here
}
}
}
错误堆栈跟踪:
at
Caused by org.springframework.beans.factory.BeanCreationException : Error creating bean ...
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:137)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)
答案 0 :(得分:0)
这是因为@lazy注释。如文档中所述:
ApplicationContext实现的默认行为是在启动时急切地预先实例化所有单例bean。预实例化意味着ApplicationContext将急切地创建和配置其所有单例bean作为其初始化过程的一部分。通常这是一件好事,因为这意味着将立即发现配置或周围环境中的任何错误(而不是可能是几小时甚至几天)。
请查看以下链接以供参考:Using Spring @Lazy and @PostConstruct annotations
Spring: how to initialize related lazy beans after main bean creation