网上讲到的spring生命周期,基本都是用的这张图:
然而我通过代码实践,得到的结论却是不一样的:
@Component
public class SpringBean implements BeanNameAware,
BeanFactoryAware,
ApplicationContextAware,
BeanPostProcessor, InitializingBean, DisposableBean {
@Autowired
private void setOwnBeanFactory(BeanFactory beanFactory) {
System.out.println("填充属性");
}
public SpringBean() {
System.out.println("实例化");
}
/**
* BeanNameAware
* @param name
*/
@Override
public void setBeanName(String name) {
System.out.println("调用BeanNameAware.setBeanName():" + name);
}
/**
* BeanFactoryAware
* @param beanFactory
* @throws BeansException
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("调用BeanFactoryAware.setBeanFactory()");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("调用ApplicationContextAware.setApplicationContext()");
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("调用BeanPostProcessor.postProcessBeforeInitialization(),beanName:" + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("调用BeanPostProcessor.postProcessAfterInitialization(),beanName:" + beanName);
return bean;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("调用InitializingBean.afterPropertiesSet()");
}
@PostConstruct
private void init() {
System.out.println("调用@PostConstruct自定义初始化方法");
}
@PreDestroy
public void destory(){
System.out.println("销毁:调用@PreDestroy自定义销毁方法");
}
@Override
public void destroy() throws Exception {
System.out.println("销毁:调用DisposableBean.destroy()");
}
}
启动程序打印的结果却是:
实例化
填充属性
调用BeanNameAware.setBeanName():springBean
调用BeanFactoryAware.setBeanFactory()
调用ApplicationContextAware.setApplicationContext()
调用@PostConstruct自定义初始化方法
调用InitializingBean.afterPropertiesSet()
调用BeanPostProcessor.postProcessBeforeInitialization(),beanName:org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat
调用BeanPostProcessor.postProcessAfterInitialization(),beanName:org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat
.......
可以看出,我实验的结果,从调用ApplicationContextAware.setApplicationContext() 之后和图片中是不一样的。
我用的版本是:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
什么原因呢?