spring學習之bean生命週期的管理

三種方式

init和destroy

XML配置中,bean標籤,init-method用來指定bean初始化後調用的方法,destroy-method用來指定bean銷燬前調用的方法。若是想統一設置,能夠在beans中設置default-init-method屬性。
註解中,@Bean註解,initMethod用來指定bean初始化後調用的方法,destroyMethod用來指定bean銷燬前調用的方法。spring

InitializingBean和DisposableBean

org.springframework.beans.factory.InitializingBean接口,在其餘初始化工做完成後,纔開始調用他的afterPropertiesSet()方法.
org.springframework.beans.factory.DisposableBean接口,在容器銷燬時,會調用destroy()這個方法。app

@PostConstruct和@PreDestroy

@PostConstruct和@PreDestroy不屬於spring,而是屬於JSR-250規則,平常用的較多的,仍是這兩個註解。ide

三種方式執行順序

當這三種生命週期機制同時做用於同一個bean時,執行順序以下:
初始化:@PostConstruct > InitializingBean的afterPropertiesSet()方法 > init()方法。
銷燬:@PreDestroy > DisposableBean的destroy()方法 > destroy()方法。post

示例

MyBean測試

public class MyBean implements InitializingBean, DisposableBean {
    private String name;

    public MyBean(String name) {
        System.out.println("name:" + name);
        this.name = name;
    }

    public void initMethod() {
        System.out.println("initMethod");
    }

    public void destroyMethod() {
        System.out.println("destroyMethod");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("postConstruct");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("preDestroy");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("destroy");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
    }
}

MyConfigthis

@Configuration
public class MyConfig {
    @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
    public MyBean myBean() {
        return new MyBean("張三");
    }
}

測試代碼spa

@Test
public void test() {
    ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
    System.out.println("開始銷燬");
    ((AnnotationConfigApplicationContext) app).close();
}

運行結果以下
image.png
XML的配置同@bean註解,這邊不作演示。code

相關文章
相關標籤/搜索