【Spring】Bean的生命周期

时间:2024-10-12 13:39:53

在 Spring 容器中,Bean 的生命周期可以分为以下几个阶段:

实例化:创建 Bean 实例。
属性赋值:注入依赖属性。
        BeanPostProcessor 的 postProcessBeforeInitialization 方法:调用所有注册的         BeanPostProcessor 的 postProcessBeforeInitialization 方法。
初始化前:调用 InitializingBean 接口的 afterPropertiesSet 方法。
初始化前:调用 @PostConstruct 注解的方法。
初始化前:调用 init-method 配置的方法。
        BeanPostProcessor 的 postProcessAfterInitialization 方法:调用所有注册的         BeanPostProcessor 的 postProcessAfterInitialization 方法。
使用 Bean:Bean 完成初始化后,可以被其他 Bean 使用。
销毁:调用 DisposableBean 接口的 destroy 方法。
销毁:调用 @PreDestroy 注解的方法。
销毁:调用 destroy-method 配置的方法。


BeanPostProcessor 的调用顺序


1、postProcessBeforeInitialization 方法
在 Bean 的初始化方法(如 afterPropertiesSet、@PostConstruct、init-method)之前调用。
所有注册的 BeanPostProcessor 的 postProcessBeforeInitialization 方法都会按顺序调用。


2、postProcessAfterInitialization 方法
在 Bean 的初始化方法(如 afterPropertiesSet、@PostConstruct、init-method)之后调用。
所有注册的 BeanPostProcessor 的 postProcessAfterInitialization 方法都会按顺序调用。


调用顺序的规则
1、按注册顺序调用:
BeanPostProcessor 的调用顺序是按照它们在 Spring 容器中注册的顺序来执行的。
如果你在配置文件中定义了多个 BeanPostProcessor,它们的调用顺序就是它们在配置文件中出现的顺序。
2、优先级:
如果 BeanPostProcessor 实现了 Ordered 接口,可以指定一个优先级。优先级数值越小,优先级越高。
优先级相同的 BeanPostProcessor 按照注册顺序调用。


示例
假设你有三个 BeanPostProcessor 实现类:CustomBeanPostProcessor1、CustomBeanPostProcessor2 和 CustomBeanPostProcessor3,并且它们都实现了 Ordered 接口。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;

public class CustomBeanPostProcessor1 implements BeanPostProcessor, Ordered {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("CustomBeanPostProcessor1 before initialization of bean: " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("CustomBeanPostProcessor1 after initialization of bean: " + beanName);
        return bean;
    }

    @Override
    public int getOrder() {
        return 1;
    }
}

public class CustomBeanPostProcessor2 implements BeanPostProcessor, Ordered {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("CustomBeanPostProcessor2 before initialization of bean: " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("CustomBeanPostProcessor2 after initialization of bean: " + beanName);
        return bean;
    }

    @Override
    public int getOrder() {
        return 2;
    }
}

public class CustomBeanPostProcessor3 implements BeanPostProcessor, Ordered {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("CustomBeanPostProcessor3 before initialization of bean: " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("CustomBeanPostProcessor3 after initialization of bean: " + beanName);
        return bean;
    }

    @Override
    public int getOrder() {
        return 3;
    }
}

配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public CustomBeanPostProcessor1 customBeanPostProcessor1() {
        return new CustomBeanPostProcessor1();
    }

    @Bean
    public CustomBeanPostProcessor2 customBeanPostProcessor2() {
        return new CustomBeanPostProcessor2();
    }

    @Bean
    public CustomBeanPostProcessor3 customBeanPostProcessor3() {
        return new CustomBeanPostProcessor3();
    }

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

运行结果
假设 MyBean 的定义如下:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        // 1. 实例化一个 ApplicationContext 对象
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // 2. 获取并使用 Bean
        MyBean myBean = context.getBean(MyBean.class);
        myBean.doSomething();
    }
}

输出结果

CustomBeanPostProcessor1 before initialization of bean: myBean CustomBeanPostProcessor2 before initialization of bean: myBean CustomBeanPostProcessor3 before initialization of bean: myBean CustomBeanPostProcessor1 after initialization of bean: myBean CustomBeanPostProcessor2 after initialization of bean: myBean CustomBeanPostProcessor3 after initialization of bean: myBean

MyBean is doing something...

总结
调用顺序:BeanPostProcessor 的 postProcessBeforeInitialization 和 postProcessAfterInitialization 方法按注册顺序调用。
优先级:如果 BeanPostProcessor 实现了 Ordered 接口,可以指定优先级,优先级数值越小,优先级越高。
固定顺序:确保在 Bean 的生命周期中,BeanPostProcessor 的调用顺序是固定的,不会乱序。