spring中构造方法/@PostConstruct/@Autowired/@Value的执行顺序
从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。
使用
说明:使用两个类测试,TestController和TestService
将TestService ,使用@Autowired注入TestController中,
同时在TestService中使用@Value
分别在两个类中使用@PostConstruct和无参构造.
观察启动输出情况已经注入情况
第一个TestController
@RestController
public class TestController {
@Autowired
private TestService service;
public TestController() {
System.out.println("------------------这里是TestController的构造方法");
System.out.println("==注入的TestService=="+service);
System.out.println("---------------------------------------------");
}
@PostConstruct
public void testPostConstruct() {
System.out.println("-------这里是TestController的@PostCOnstruct方法");
System.out.println("==注入的TestService=="+service);
System.out.println("---------------------------------------------");
}
@RequestMapping("/get")
public String get() {
return service.get();
}
}
第二个TestService
@Service
public class TestService {
@Value("${test.string}")
private String testString;
public String get() {
return "这里使用testService";
}
public TestService() {
System.out.println("---------------------这里是TestService的构造方法");
System.out.println("==testString=="+testString);
System.out.println("---------------------------------------------");
}
@PostConstruct
public void testPostConstruct() {
System.out.println("----------这里是TestService的@PostConstruct方法");
System.out.println("==testString=="+testString);
System.out.println("---------------------------------------------");
}
}
输出结果
------------------这里是TestController的构造方法
==注入的TestService==null
---------------------------------------------
---------------------这里是TestService的构造方法
==testString==null
---------------------------------------------
----------这里是TestService的@PostConstruct方法
==testString==testString
---------------------------------------------
-------这里是TestController的@PostCOnstruct方法
==注入的TestService==com.jd.service.TestService@6718f0d8
---------------------------------------------
可以看出先调用的两个类的构造方法,在调用构造方法的时候,@Autowired和@Value注入都是null;
随后调用的是@PostConstruct修饰的方法,此时的注入已经有了结果,so,肯定是在之前执行的.
结论
构造方法 >>>> @Autowired/@Value >>>> @PostConstruct