为什么@PostConstruct导致NullPointerException?

时间:2019-02-26 13:32:55

标签: java spring

我正在学习Spring Framework,同时观看Evgeniy Borisov的lecture,我遇到了以下代码:

假设我们有两个具有循环依赖关系的bean:

第二个豆:

@Service
public class Two {

    @Autowired
    private One one;


    public String getWord() {
        return word;
    }

    private String word;


    @PostConstruct
    public void doSmth(){
        init();
        System.out.println("SECOND BEAN TEXT :"+one.getWord());
    }

        public void init(){
            word = "Second word";
    }
}

第一个bean:

@Service
public class One {
    @Autowired
    private Two two;

    public String getWord() {
        return word;
    }
    private String word;

    @PostConstruct
    public void doSmth(){
        init();
        System.out.println("FIRST BEAN TEXT :"+two.getWord());
    }

    public void init(){
        word = "First bean";
    }
} 

然后开始上课:

public class StartTests {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext("test");
    }
}

如果执行StartTests类,则会在输出中得到它:

  

第二个纯文本:空

     

第一个豆豆文本:第二个单词

是的,我知道@PostConstructor在涉及所有代理之前执行,但是我不明白为什么First Bean正常工作而Second Bean无法正常工作

2 个答案:

答案 0 :(得分:2)

这只是关于执行顺序。毕竟,其中其中一个必须首先运行!

  1. Spring贯穿所有@Autowiring(工作正常)
  2. Spring按 some 顺序遍历所有@PostConstruct

在您的计算机中,One的@PostConstruct恰好先运行,然后Two之后运行。

答案 1 :(得分:1)

如果您想在One之前初始化Bean Two,则可以添加@DependsOn

@DependsOn({"One"})
@Service
public class Two {
  

可用于直接或间接用Component注释的任何类或用Bean注释的方法。

尽管在其他日志中您将得到null