Java 调用另一个bean';@PostConstruct中的s方法引发了空指针

Java 调用另一个bean';@PostConstruct中的s方法引发了空指针,java,spring,spring-ioc,Java,Spring,Spring Ioc,我正在使用Spring4 有三个bean:bean1和bean2和bean3,在我的bean1的@PostConstruct方法中,我调用了bean2的方法,bean2的这个方法将调用bean3的方法,我得到了一个NPE,bean2中的beacuse方法被调用,bean3还没有被注入 如何避免这种情况?代码如下所示: @Service public class Bean1 { @Autowired private Bean2 bean2; @PostConstruct

我正在使用Spring4

有三个bean:
bean1
bean2
bean3
,在我的bean1的
@PostConstruct
方法中,我调用了bean2的方法,
bean2
的这个方法将调用bean3的方法,我得到了一个NPE,bean2中的beacuse方法被调用,
bean3
还没有被注入

如何避免这种情况?代码如下所示:

@Service
public class Bean1 {
    @Autowired
    private Bean2 bean2;
    @PostConstruct
    public void init() {
        // invoke bean2's method
        bean2.test();
    }

}

@Service
public class Bean2 {
    @Autowired
    private Bean3 bean3;

    public void test() {
        // invoke bean3's method,got a null pointer ex,because bean3 is null.
        bean3.xxx();
    }
}

不管你发了什么代码,我不认为你会有任何问题。 只需签入您自己创建bean的整个代码,而不是spring—这只是一种情况


若您自己创建bean,那个么spring将不会注入任何东西,并将bean对象提供为null。post

您需要
@DependsOn
注释来确保bean初始化按照您期望的顺序进行。

转到构造函数注入而不是字段注入。@M.Deinum在这种情况下,Spring在满足Bean2依赖项之前是否将Bean2注入Bean1?是的,因为
Bean2
可能仍在构建中,事实就是这样。对于构造函数注入,这无法实现,因为需要实现构造函数。一般建议使用构造函数注入而不是字段注入。@M.Deinum非常感谢。使用字段注入时,您的类中可能会有一个仍在构建中的bean。Spring确实试图获得正确的顺序,但是通过字段注入,您可以得到一个半初始化的bean,因为很难确定依赖项。有了构造函数注入,这是不可能的,因为你不能创建一个没有依赖关系的对象。它确实发生在我的项目中。我正在使用springjpa,Bean3是一个定制的存储库类,扩展了
crudepository
。我不知道这是否与此有关。此外,我构建了一个简单的spring项目来模拟这种情况,没有例外……所以我现在很困惑。如何在实现Crudepository上使用extend来代替请展示您的bean3类公共接口xxRepository extends Crudepository。