美文网首页
Spring bean的生命周期

Spring bean的生命周期

作者: 蜗牛写java | 来源:发表于2019-03-24 22:50 被阅读0次

    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);
     }
    

    相关文章

      网友评论

          本文标题:Spring bean的生命周期

          本文链接:https://www.haomeiwen.com/subject/otzpvqtx.html