1. 程式人生 > >spring之bean的生命週期

spring之bean的生命週期

生命週期的過程:

spring容器管理bean的生命週期

bean的建立——初始化——銷燬

我們也可以通過自定義初始化和銷燬方法:容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法

1)指定初始化和銷燬方法

bean的實體類:

public class Blue {
    public Blue(){
        System.out.println("執行了構造方法...");
    }
    public void init(){
        System.out.println("執行了初始化方法...");
    }
    public void destroy(){
        System.out.println("執行了銷燬方法");
    }
}

MainConfig配置類:

@Bean(initMethod = "init",destroyMethod = "destroy")
public Blue blue(){
    return new Blue();
}

測試類:

public class IocTest {
    private AnnotationConfigApplicationContext applicationContext;

    @Before
    public void init(){
        applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("容器建立完成了...");
    }
    @Test
    public void testLifeCycle(){
        applicationContext.getBean("blue");
        applicationContext.close();
    }
}

測試結果:

九月 10, 2019 5:05:37 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
資訊: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 17:05:37 CST 2019]; root of context hierarchy
執行了構造方法...
執行了初始化方法...
容器建立完成了...

九月 10, 2019 5:05:37 下午 org.springframework.context.support.AbstractApplicationContext doClose
執行了銷燬方法

結論:我們可以看到指定的初始化方法是在bean物件建立完成後呼叫,銷燬方法是在容器關閉的時候呼叫的。

​ 值得一提的是如果bean物件是多例項的時候,spring不會呼叫其銷燬方法,物件的銷燬由JVM進行回收。

2)InitializingBean和DisposableBean

作用:我們可以通過讓Bean實現InitializingBean(定義初始化邏輯)和DisposableBean(定義銷燬邏輯)

Cat實體類

@Component
public class Cat implements InitializingBean,DisposableBean {
    public Cat(){
        System.out.println("執行了構造方法...");
    }
    public void destroy() throws Exception {
        System.out.println("destroy...");
    }

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

測試類

public class IocTest {
    private AnnotationConfigApplicationContext applicationContext;

    @Before
    public void init(){
        applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("容器建立完成了...");
    }
    @Test
    public void testLifeCycle(){
        applicationContext.getBean("cat");
        applicationContext.close();
    }
}

測試結果

資訊: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 17:26:30 CST 2019]; root of context hierarchy
執行了構造方法...
afterPropertiesSet...
容器建立完成了...
九月 10, 2019 5:26:30 下午 org.springframework.context.support.AbstractApplicationContext doClose
資訊: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 17:26:30 CST 2019]; root of context hierarchy
destroy...

3)JSR250

作用:在這裡你可以使用@PostConstruct註解作為初始化回撥的替代和@PreDestroy註解作為銷燬回撥的替代

Bean實體類

@Component
public class Blue {
    public Blue(){
        System.out.println("構造方法執行了...");
    }
    //物件建立並賦值之後呼叫
    @PostConstruct
    public void init(){
        System.out.println("init...執行了");
    }
    //移除Bean之後呼叫
    @PreDestroy
    public void destroy(){
        System.out.println("destroy...執行了");
    }
}

測試類

public class IocTest {
    private AnnotationConfigApplicationContext applicationContext;

    @Before
    public void init(){
        applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("容器建立完成了...");
    }
    @Test
    public void testLifeCycle(){
        applicationContext.getBean("blue");
        applicationContext.close();
    }
}

測試結果

九月 10, 2019 7:41:06 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
資訊: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 19:41:06 CST 2019]; root of context hierarchy
構造方法執行了...
init...執行了
九月 10, 2019 7:41:06 下午 org.springframework.context.support.AbstractApplicationContext doClose
資訊: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 19:41:06 CST 2019]; root of context hierarchy
容器建立完成了...
destroy...執行了

4)BeanPostProcessor後置處理器

作用:可以自定義BeanPostProcessor的實現類來對bean物件初始化前後進行操作

@Component
public class MyBeanPostProcessor implements BeanPostProcessor{
    /**
     *
     * @param bean 將要建立的例項物件
     * @param beanName 例項物件在容器中的名字
     * @return 我們可以將要建立的bean物件進行包裝之後返回
     * @throws BeansException
     */
    //bean物件初始化方法執行前執行
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization...執行了");
        return bean;
    }
    //bean物件初始化方法執行後執行
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization...執行了");
        return bean;
    }
}