在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屬性指定初始化之後 /銷燬之前調用的操作方法。
總結:
- spring爲bean提供了兩種初始化bean的方式,實現InitializingBean接口,實現afterPropertiesSet方法,或者在配置文件中通過init-method指定,兩種方式可以同時使用
- 實現InitializingBean接口是直接調用afterPropertiesSet方法,比通過反射調用init-method指定的方法效率相對來說要高點。但是init-method方式消除了對spring的依賴
- 先調用afterPropertiesSet,再執行 init-method 方法,如果調用afterPropertiesSet方法時出錯,則不調用init-method指定的方法。
C:在指定方法上加上@PostConstruct 或@PreDestroy註解來制定該方法是在初始化之後還是銷燬之前調用。
總結:
- spring bean的初始化執行順序:構造方法 -->
@PostConstruct
註解的方法 -->afterPropertiesSet
方法 -->init-method
指定的方法。 afterPropertiesSet
通過接口實現方式調用(效率上高一點),@PostConstruct
和init-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());
}
}