首先,spring的加载顺序是先构造函数,之后注入类似@Autowried,@Value。
目前有个场景,需要在构造函数内注入配置文件中属性值,示例如下:
public abstract class SomeBase {
private String variable;
public SomeBase(String v){
this.variable = v;
}
}
@Service
public class Test extend SomeBase{
@Value("${test.properties:aa}")
private String variable;
public Test(){
super(variable);
}
}
注意这样是行不通的,IDE给出的编译错误信息如下:
Cannot reference 'xx' before supertype constructor has been called
主要原因是spring在进行初始化bean时,由于先进行构造函数,而后进行注入,所以导致spring不认可这种做法。
原因说清楚了,关键是,怎么解决呢?通过各位猿哥哥的博客翻阅,最终通过如下方式注入:
@Service
public class Test extend SomeBase{
public Test(@Value("${test.properties:aa}") String variable){
super(variable);
}
}
到此,问题得以解决。
总结:spring对bean的注入顺序是无法改变的,但是它提供了别的机制容许我们实现短暂的顺序调整,这种编码思路和风格值得我们学习。