在Spring框架中,Bean的生命周期是指从Bean的创建、初始化、使用到销毁的整个过程。Spring容器负责管理Bean的生命周期,并提供了多种扩展点,允许开发者在Bean的不同生命周期阶段执行自定义逻辑。

Bean生命周期的核心阶段

实例化(Instantiation)

  • Spring容器根据配置或注解创建Bean的实例;

  • 如果Bean是通过构造器注入依赖的,Spring会调用相应的构造器。

属性赋值(Population of Properties)

  • Spring容器将配置的属性值或依赖注入到Bean中;

  • 支持通过Setter方法、字段注入或构造器注入。

初始化(Initialization)

  • 在Bean的属性赋值完成后,Spring容器会调用初始化方法;

  • 初始化方法可以通过以下方式定义:

    • 实现InitializingBean接口的afterPropertiesSet()方法;

    • 使用@PostConstruct注解;

    • 在XML配置中指定init-method

使用(In Use)

  • Bean初始化完成后,可以被应用程序使用;

  • Bean通常作为单例(Singleton)存在于Spring容器中,直到容器关闭。

销毁(Destruction)

  • 当Spring容器关闭时,会销毁Bean实例;

  • 销毁方法可以通过以下方式定义:

    • 实现DisposableBean接口的destroy()方法;

    • 使用@PreDestroy注解;

    • 在XML配置中指定destroy-method

Bean生命周期的扩展点

Spring提供了多个扩展点,允许开发者在Bean生命周期的不同阶段插入自定义逻辑。

BeanPostProcessor

  • BeanPostProcessor是一个接口,允许在Bean初始化前后执行自定义逻辑;

  • 主要方法:

    • postProcessBeforeInitialization():在Bean初始化之前调用;

    • postProcessAfterInitialization():在Bean初始化之后调用。

  • 示例

    public class CustomBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) {
            System.out.println("Before Initialization: " + beanName);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) {
            System.out.println("After Initialization: " + beanName);
            return bean;
        }
    }

BeanFactoryPostProcessor

  • BeanFactoryPostProcessor允许在BeanFactory加载Bean定义之后、Bean实例化之前修改Bean的定义;

  • 主要方法:

    • postProcessBeanFactory():在BeanFactory初始化后调用。

  • 示例

    public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
            System.out.println("BeanFactoryPostProcessor is running");
        }
    }

Aware接口

  • Spring提供了一系列Aware接口,允许Bean获取Spring容器的一些基础设施对象;

  • 常见的Aware接口:

    • BeanNameAware:获取Bean的名称;

    • BeanFactoryAware:获取BeanFactory;

    • ApplicationContextAware:获取ApplicationContext。

  • 示例

    public class CustomBean implements BeanNameAware {
        private String beanName;
    
        @Override
        public void setBeanName(String name) {
            this.beanName = name;
            System.out.println("Bean name is: " + beanName);
        }
    }

Bean生命周期的完整流程

  1. 实例化:Spring容器创建Bean实例;

  2. 属性赋值:Spring容器注入Bean的属性和依赖;

  3. BeanNameAware:如果Bean实现了BeanNameAware,调用setBeanName()方法;

  4. BeanFactoryAware:如果Bean实现了BeanFactoryAware,调用setBeanFactory()方法;

  5. ApplicationContextAware:如果Bean实现了ApplicationContextAware,调用setApplicationContext()方法;

  6. BeanPostProcessor的前置处理:调用BeanPostProcessorpostProcessBeforeInitialization()方法;

  7. 初始化:

    • 如果Bean实现了InitializingBean,调用afterPropertiesSet()方法;

    • 如果Bean配置了init-method,调用指定的初始化方法;

    • 如果Bean使用了@PostConstruct注解,调用标注的方法。

  8. BeanPostProcessor的后置处理:调用BeanPostProcessorpostProcessAfterInitialization()方法;

  9. 使用:Bean初始化完成,可以被应用程序使用;

  10. 销毁:

    • 如果Bean实现了DisposableBean,调用destroy()方法;

    • 如果Bean配置了destroy-method,调用指定的销毁方法;

    • 如果Bean使用了@PreDestroy注解,调用标注的方法。