spring的生命周期是怎么样的

85 阅读2分钟

Spring框架的生命周期主要围绕Bean的管理展开,涉及Bean的创建、初始化、使用和销毁。以下是Spring Bean的详细生命周期:

  1. Bean定义

    • 在配置文件(如XML或Java配置类)中定义Bean,包括其依赖关系和初始化方法等。
  2. 容器启动

    • Spring容器启动(如ApplicationContext),读取配置文件或注解,解析并注册所有Bean定义。
  3. 实例化Bean

    • 容器根据Bean定义实例化Bean对象。
  4. 设置Bean属性

    • 容器注入Bean的属性和依赖(通过setter方法或构造器注入)。
  5. BeanNameAware接口的回调

    • 如果Bean实现了BeanNameAware接口,Spring会调用setBeanName方法,传递Bean的名字。
  6. BeanFactoryAware接口的回调

    • 如果Bean实现了BeanFactoryAware接口,Spring会调用setBeanFactory方法,传递BeanFactory实例。
  7. ApplicationContextAware接口的回调

    • 如果Bean实现了ApplicationContextAware接口,Spring会调用setApplicationContext方法,传递ApplicationContext实例。
  8. BeanPostProcessor的前置处理

    • Spring在Bean初始化之前,调用所有注册的BeanPostProcessorpostProcessBeforeInitialization方法。
  9. InitializingBean接口的回调

    • 如果Bean实现了InitializingBean接口,Spring会调用afterPropertiesSet方法。
    • 或者,通过配置初始化方法(如<bean init-method="init"/>),调用指定的初始化方法。
  10. BeanPostProcessor的后置处理

    • Spring在Bean初始化之后,调用所有注册的BeanPostProcessorpostProcessAfterInitialization方法。
  11. Bean准备就绪

    • 此时,Bean已经完全初始化并准备好被应用程序使用。
  12. Bean的使用

    • 应用程序开始使用容器中的Bean。
  13. 容器关闭

    • 当应用程序关闭时,Spring容器开始销毁过程。
  14. DisposableBean接口的回调

    • 如果Bean实现了DisposableBean接口,Spring会调用destroy方法。
    • 或者,通过配置销毁方法(如<bean destroy-method="cleanup"/>),调用指定的销毁方法。

图示概述

+-------------------------+
| Bean Definition         |
+-------------------------+
            |
+-------------------------+
| Container Startup       |
+-------------------------+
            |
+-------------------------+
| Bean Instantiation      |
+-------------------------+
            |
+-------------------------+
| Set Bean Properties     |
+-------------------------+
            |
+-------------------------------+
| BeanNameAware#setBeanName     |
+-------------------------------+
            |
+--------------------------------+
| BeanFactoryAware#setBeanFactory|
+--------------------------------+
            |
+------------------------------------+
| ApplicationContextAware#setApplicationContext |
+------------------------------------+
            |
+-------------------------------+
| BeanPostProcessor#beforeInit   |
+-------------------------------+
            |
+----------------------------+
| InitializingBean#afterPropertiesSet |
|        OR                   |
| Custom init-method          |
+----------------------------+
            |
+-------------------------------+
| BeanPostProcessor#afterInit   |
+-------------------------------+
            |
+-------------------+
| Bean Ready       |
+-------------------+
            |
+-------------------+
| Bean in Use      |
+-------------------+
            |
+-------------------+
| Container Shutdown|
+-------------------+
            |
+----------------------------+
| DisposableBean#destroy      |
|        OR                   |
| Custom destroy-method       |
+----------------------------+

示例代码

以下是一个示例代码,演示Spring Bean的生命周期:

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {

    private String property;

    public void setProperty(String property) {
        this.property = property;
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("BeanNameAware: setBeanName called with " + name);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        System.out.println("BeanFactoryAware: setBeanFactory called");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        System.out.println("ApplicationContextAware: setApplicationContext called");
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println("InitializingBean: afterPropertiesSet called");
    }

    public void customInit() {
        System.out.println("Custom init-method: customInit called");
    }

    @Override
    public void destroy() {
        System.out.println("DisposableBean: destroy called");
    }

    public void customDestroy() {
        System.out.println("Custom destroy-method: customDestroy called");
    }

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        MyBean myBean = (MyBean) context.getBean("myBean");
        ((ClassPathXmlApplicationContext) context).close();
    }
}

beans.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="myBean" class="com.example.MyBean" init-method="customInit" destroy-method="customDestroy">
        <property name="property" value="someValue"/>
    </bean>
</beans>

通过这个示例代码,可以看到Spring Bean的完整生命周期,包括属性设置、初始化和销毁。