近段时间面试比较多,Spring是必问题型之一,顺便整理一下当做复习。本次分享主要整理spring bean的生命周期,描述内容由网络资料整理而来,代码证明及图示为本地编写。
参考Blog:https://www.cnblogs.com/javazhiyin/p/10905294.html
一、描述:
- Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化;
- 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法;
- 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
- 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来;
- 如果Bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用;
- 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直保留在应用上下文中,直到应用上下文被销毁;
- 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method声明销毁方法,该方法也会被调用。
图示:
代码证明:
@Component
public class Book implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {
private String bookName;
public Book() {
System.out.println("Book 空构造器");
bookName = "bookNameStr";
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
System.out.println("Book,setBookName:"+bookName);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("Book,setBeanFactory");
}
@Override
public void setBeanName(String s) {
System.out.println("Book,setBeanName:"+s);
}
@Override
public void destroy() throws Exception {
System.out.println("Book,destory");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Book,afterPropertiesSet");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("Book,setApplicationContext");
}
@PostConstruct
public void postConstructMethod() {
System.out.println("Book,postConstructMethod");
}
@PreDestroy
public void preDestroyMethod() {
System.out.println("Book,preDestroyMethod");
}
@Override
protected void finalize() throws Throwable {
System.out.println("Book,finalize");
super.finalize();
}
}