自动注入一般在构造函数之后,比如 @Autowired修饰的属性、@Value、@Resource、 @PostConstruct修饰的方法、 InitializingBean的afterPropertiesSet()方法、 @Bean的initMethod属性指定的方法
那么它们的先后顺序又是怎样的呢?
interface S extends InitializingBean {
void init();
}
@Bean(initMethod = "init")
public S s() {
return new S() {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet");
}
@Override
public void init() {
System.out.println("init");
}
@PostConstruct
public void PostConstruct() {
System.out.println("PostConstruct");
}
};
}
结果如下图
@Autowired修饰的set方法在构造函数之后,@PostConstruct 之前
public interface Inte {
void say();
}
public class InteA implements Inte{
@Override
public void say() {
System.out.println("InteA");
}
}
public class InteB implements Inte{
@Override
public void say() {
System.out.println("InteB");
}
}
@Component
class S {
Inte sI = new InteA();
S() {
sI.say();
}
@Autowired
public void setsI(Inte sI) {
System.out.println("setter");
this.sI = sI;
sI.say();
}
@PostConstruct
public void f() {
System.out.println("PostConstruct");
sI.say();
}
public Inte getsI() {
return sI;
}
}
结果如图:
结论
构造函数>(@Autowired、@Value、@Resource)> @PostConstruct > afterPropertiesSet() > initMethod