Spring bean的生命周期

2019-03-24  本文已影响0人  蜗牛写java

Spring bean的生命周期

生命周期

bean从创建 -> 初始化 -> 销毁的过程

默认情况下 bean的生命周期是容器来管理的

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

自定义初始化和销毁的几种方式1.指定初始化和销毁方法

  1. xml 指定init-method和destory-method

    xml 指定init-method和destory-method

  2. 通过@Bean指定init-method和destroy-method

    @Bean(initMethod="init", destroyMethod="destory")
    public Car car() {
     return new Car();
    }
    

    说明:初始化和销毁方法均为无参方法

    构造器

    ​ 单实例:在容器启动的什时候创建对象

    ​ 初始化:对象创建好,并赋值好,调用初始化方法

    ​ 销毁:容器关闭的时候

    ​ 多实例:在每次获取的时候创建对象

    ​ 初始化:获取对象时候,创建对象,并赋值好,调用初始化方法

    ​ 销毁:不会随容器关闭而销毁;容器不会管理销毁方法

  3. 通过让Bean实现InitializingBean(定义初始化逻辑);DisposableBean(定义销毁逻辑);

    @Component
    public class Cat implements InitializingBean, DisposableBean{
     public Cat() {
         System.out.println("cat constructor...");
     }
        //初始化方法
     @Override
     public void afterPropertiesSet() throws Exception{
         System.out.println("cat...init...");
     }
        //销毁方法
     @Override
     public void destroy() throws Exception {
         System.out.println("cat...destory...");
     }
    }
    
  4. 使用JSR250 (java 注解)

    @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法

    @PreDestroy:在容器销毁bean之前通知我们进行清理工作

    @Component
    public class Dog implements ApplicationContextAware{
     public Dog() {
         System.out.println("dog constructor...");
     }
     //对象创建并赋值之后调用
     @PostConstruct
     public void init() {
         System.out.println("dog...@PostConstruct...");
     }
     //容器移除之前
     @PreDestroy
     public void destroy() {
         System.out.println("dog...@PreDestroy...");
     }
    }
    
  5. BeanPostProcessor【interface】:bean的后置处理器;(针对容器中所有的bean)

    在bean初始化前后进行一些处理工作;

    postProcessBeforeInitialization:在初始化之前工作

    postProcessAfterInitialization:在初始化之后工作

    构造器 -> 赋值 -> postProcessBeforeInitialization -> 初始化 -> postProcessAfterInitialization

    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor{
    
     @Override
     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
         System.out.println("postProcessBeforeInitialization..." + beanName + "=>" + beanName);
         return bean;
     }
    
     @Override
     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
         System.out.println("postProcessAfterInitialization..." + beanName + "=>" + beanName);
         return bean;
     }
    
    }
    

    输出:

    postProcessBeforeInitialization...org.springframework.context.event.internalEventListenerProcessor=>org.springframework.context.event.internalEventListenerProcessor
    postProcessAfterInitialization...org.springframework.context.event.internalEventListenerProcessor=>org.springframework.context.event.internalEventListenerProcessor
    ...

    cat constructor...
    postProcessBeforeInitialization...cat=>cat
    cat...init...
    postProcessAfterInitialization...cat=>cat
    容器创建完成...

    cat...destory...

源码分析:

BeanPostProcessor原理

AbstractAutowireCapableBeanFactory

 populateBean(beanName, mbd, instanceWrapper);//给bean进行属性赋值
 initializeBean
 {
    applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化
    applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
 }
上一篇下一篇

猜你喜欢

热点阅读