Bootstrap

Spring - IOC - Bean生命周期

Spring - Bean生命周期

在Spring框架中,Bean的生命周期是指从Bean的实例化开始直到销毁的过程。下面是一个典型的Spring Bean的生命周期:

  1. 实例化:

    • Spring容器根据配置信息(如XML配置文件或注解)创建Bean的实例。
    • 如果Bean是通过构造器注入,那么会调用相应的构造器来创建实例;如果是无参构造器,则直接调用默认构造器。
  2. 属性填充:

    • Spring根据配置信息将其他Bean注入到当前Bean的属性中。
    • 对于@Autowired注解的字段,Spring会查找并注入匹配的Bean。
  3. Aware接口回调:

    • 如果Bean实现了BeanNameAware,则调用setBeanName(String name)方法。
    • 如果Bean实现了BeanFactoryAware,则调用setBeanFactory(BeanFactory factory)方法。
    • 如果Bean实现了ApplicationContextAware,则调用setApplicationContext(ApplicationContext context)方法。
  4. 后置处理器回调:

    • 如果有BeanPostProcessor实现类注册在容器中,它们的postProcessBeforeInitialization(Object bean, String beanName)方法会被调用。
  5. 初始化方法调用:

    • 如果Bean定义了init-method属性,那么对应的初始化方法会被调用。

      @Component
      public class A {
          @PostConstruct  //等价与init-method
          public void init() {
              System.out.println("初始化--->@PostConstruct");
          }
      }
      
    • 如果Bean实现了InitializingBean接口,那么afterPropertiesSet()方法会被调用。

      @Component
      public class A implements InitializingBean {
      
          @Override
          public void afterPropertiesSet() throws Exception {
              System.out.println("初始化--->InitializingBean");
          }
      }
      
  6. 后置处理器再次回调:

    • 如果有BeanPostProcessor实现类注册在容器中,它们的postProcessAfterInitialization(Object bean, String beanName)方法会被调用。
  7. Bean可用:

    • Bean现在可以被其他Bean使用,或者处理请求。
  8. 销毁:

    • 当Spring容器关闭时,如果Bean定义了destroy-method属性,那么对应的销毁方法会被调用。

      @Component
      public class A {
          @PreDestroy
          public void destroy() {
              System.out.println("销毁--->@PreDestroy");
          }
      }
      
    • 如果Bean实现了DisposableBean接口,那么destroy()方法会被调用。

      @Component
      public class A implements DisposableBean {
      
          @Override
          public void destroy() throws Exception {
              System.out.println("销毁--->DisposableBean");
          }
      }
      
;