我正在学习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无法正常工作
答案 0 :(得分:2)
这只是关于执行顺序。毕竟,其中其中一个必须首先运行!
@Autowiring
(工作正常)@PostConstruct
在您的计算机中,One
的@PostConstruct恰好先运行,然后Two
之后运行。
答案 1 :(得分:1)
如果您想在One
之前初始化Bean Two
,则可以添加@DependsOn
@DependsOn({"One"})
@Service
public class Two {
可用于直接或间接用Component注释的任何类或用Bean注释的方法。
尽管在其他日志中您将得到null