Spring 容器中的 Bean 是有生命週期的,Spring 允許在 Bean 在初始化完成後以及 Bean 銷燬前執行特定的操作,常用的設定方式有以下三種:
- 通過實現
InitializingBean 或 DisposableBean
接口來定製初始化之後/銷燬之前的操作方法; - 通過 元素的
init-method 或 destroy-method
屬性指定初始化之後 /銷燬之前調用的操作方法; - 在指定方法上加上
@PostConstruct 或 @PreDestroy
註解來制定該方法是在初始化之後還是銷燬之前調用。
@Component
public class TaskBean {
@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
public TaskService taskService() {
return new TaskService();
}
}
@Slf4j
public class TaskService implements InitializingBean, DisposableBean {
public TaskService() {
log.info("TaskService constructor execute...");
}
@PostConstruct
private void postConstruct() {
log.info("TaskService postConstruct...");
}
private void initMethod() {
log.info("TaskService initMethod...");
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("TaskService afterPropertiesSet...");
}
@PreDestroy
private void preDestroy() {
log.info("TaskService preDestroy!!!");
}
private void destroyMethod() {
log.info("TaskService destroyMethod!!!");
}
@Override
public void destroy() throws Exception {
log.info("TaskService destroy!!!");
}
}
注意:
在 IDEA 中退出應用程序, 銷燬方法執行不了,必須使用 java -jar ***.jar 才行
程序運行輸出
TaskService constructor execute...
TaskService postConstruct...
TaskService afterPropertiesSet...
TaskService initMethod...
...
TaskService preDestroy!!!
TaskService destroy!!!
TaskService destroyMethod!!!
通過輸出結果得知(三者的執行順序):
構造函數 => PostConstruct => InitializingBean => initMethod