【Spring注解系列10】SpringBean的生命周期

1.SpringBean生命周期定义

指bean创建---初始化----销毁的过程。

构造(对象创建):

  • 单实例:在容器启动的时候创建对象
  • 多实例:在每次获取的时候创建对象

初始化和销毁方式:

  • 指定初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。

            @Bean中指定的 initMethod 和 destroyMethod

  • bean后置处理器BeanPostProcessor实现初始化:在bean初始化前后进行一些处理工作

             BeanPostProcessor.postProcessBeforeInitialization 初始化

                   对象创建完成,并赋值好,调用初始化方法。。。

             BeanPostProcessor.postProcessAfterInitialization  销毁

                    单实例:容器关闭的时候
                    多实例:容器不会管理这个bean;容器不会调用销毁方法;

  • 通过让Bean实现InitializingBean 定义初始化逻辑,DisposableBean定义销毁逻辑;
  • 使用JSR250注解@PostConstruct 和 @PreDestroy

             @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
             @PreDestroy:在容器销毁bean之前通知我们进行清理工作


2.生命周期中执行顺序

生命周期流程:

执行构造方法--->bean后置处理器--->@PostConstruct--->InitializingBean--->@Bea指定的初始化方法--->bean后置处理器

--->容器准备关闭(或者移除实例)---> @PreDestroy--->DisposableBean--->@Bean指定的销毁方法--->容器关闭

 

3.实例

//对象实例类
public class BeanLife implements InitializingBean,DisposableBean{

    public BeanLife() {
        System.out.println("构造方法:BeanLife--->construct...");
    }

    public void selfInit(){
        System.out.println("@Bean指定初始化方法:BeanLife--->selfInit");
    }

    public void selfDestroy(){
        System.out.println("@Bean指定初销毁方法:BeanLife--->selfDestroy");
    }

    @PostConstruct
    public void postConstruct(){
        System.out.println("@PostConstruct注解:BeanLife--->@PostConstruct.PostConstruct");
    }

    @PreDestroy
    public void preDestroy(){
        System.out.println("@PreDestroy注解:BeanLife--->@PreDestroy.PreDestroy");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean接口:BeanLife--->InitializingBean.afterPropertiesSet");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean接口:BeanLife--->DisposableBean.destroy");
    }
}


//后置处理器
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Nullable
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("bean后置处理器:MyBeanPostProcessor......postProcessBeforeInitialization");
        return bean;
    }

    @Nullable
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("bean后置处理器:MyBeanPostProcessor......postProcessAfterInitialization");
        return bean;
    }
}


//配置类

@Configuration
public class BeanLifeCycleConfig {

   
    @Bean(value = "beanLife", initMethod = "selfInit", destroyMethod = "selfDestroy")
    public BeanLife life() {
        return new BeanLife();
    }

    @Bean
    public MyBeanPostProcessor myBeanPostProcessor(){
        return new MyBeanPostProcessor();
    }
}


//测试类

public class BeanLifeCycleTest {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanLifeCycleConfig.class);
        System.out.println("applicationContext ..... 初始化结束");

        System.out.println("applicationContext ..... 准备关闭");
        applicationContext.close();
        System.out.println("applicationContext ..... 已关闭");

    }
}


//测试结果:
构造方法:BeanLife--->construct...
bean后置处理器:MyBeanPostProcessor......postProcessBeforeInitialization
@PostConstruct注解:BeanLife--->@PostConstruct.PostConstruct
InitializingBean接口:BeanLife--->InitializingBean.afterPropertiesSet
@Bean指定初始化方法:BeanLife--->selfInit
bean后置处理器:MyBeanPostProcessor......postProcessAfterInitialization
applicationContext ..... 初始化结束
applicationContext ..... 准备关闭
@PreDestroy注解:BeanLife--->@PreDestroy.PreDestroy
DisposableBean接口:BeanLife--->DisposableBean.destroy
@Bean指定初销毁方法:BeanLife--->selfDestroy
applicationContext ..... 已关闭

 

你可能感兴趣的:(Spring,Spring)