Spring InitializingBean、init-method以及@PostConstruct 執行順序

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章