spring環境下 如何執行一些系統初始化工作

在Spring 環境下,一般可以用下面的方法來執行一些系統初始化工作。在spring boot環境下,則可以參考另外一篇文章

https://blog.csdn.net/bigtree_3721/article/details/88431175

A:  通過實現 InitializingBean/DisposableBean 接口來定製初始化之後/銷燬之前的操作方法

   Spring中InitializingBean接口類爲bean提供了定義初始化方法的方式,它僅僅包含一個方法:afterPropertiesSet()。
Bean實現這個接口,在afterPropertiesSet()中編寫初始化代碼。

B: 通過 <bean> 元素的 init-method/destroy-method屬性指定初始化之後 /銷燬之前調用的操作方法

總結:

  1. spring爲bean提供了兩種初始化bean的方式,實現InitializingBean接口,實現afterPropertiesSet方法,或者在配置文件中通過init-method指定,兩種方式可以同時使用
  2. 實現InitializingBean接口是直接調用afterPropertiesSet方法,比通過反射調用init-method指定的方法效率相對來說要高點。但是init-method方式消除了對spring的依賴
  3. 先調用afterPropertiesSet,再執行 init-method 方法,如果調用afterPropertiesSet方法時出錯,則不調用init-method指定的方法。

C:在指定方法上加上@PostConstruct 或@PreDestroy註解來制定該方法是在初始化之後還是銷燬之前調用。

總結:

  1. spring bean的初始化執行順序:構造方法 --> @PostConstruct註解的方法 --> afterPropertiesSet方法 --> init-method指定的方法。
  2. afterPropertiesSet通過接口實現方式調用(效率上高一點),@PostConstructinit-method都是通過反射機制調用

D:自定義 org.springframework.beans.factory.config.BeanPostProcessor ,來讓 spring 回調我們的方法來參與 bean的生命週期


3. @PostConstruct和@PreDestory可以通過在類方法上註解方式實現類似的功能。

例子代碼

@Slf4j
public class InitSequenceBean implements InitializingBean {

    public InitSequenceBean() {
        log.info("InitSequenceBean: construct");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("InitSequenceBean: afterPropertiesSet");
    }

    @PostConstruct
    public void postConstruct() {
        log.info("InitSequenceBean: postConstruct");
    }

    public void initMethod() {
        log.info("InitSequenceBean: initMethod");
    }
}

@Configuration
public class SystemConfig {

    @Bean(initMethod = "initMethod", name = "initSequenceBean")
    public InitSequenceBean initSequenceBean() {
        return new InitSequenceBean();
    }
}

@Slf4j
public class InitSequenceBeanTest extends ApplicationTests {

    @Autowired
    private InitSequenceBean initSequenceBean;

    @Test
    public void initSequenceBeanTest() {
        log.info("Finish: {}", initSequenceBean.toString());
    }
}

 

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