Bean的生命周期

91 阅读2分钟

在Spring框架中,Bean的生命周期是指一个Bean从创建到销毁的全过程。了解Bean的生命周期有助于更好地管理和优化Spring应用。以下是Spring Bean生命周期的一般步骤:

  1. 实例化:Spring容器根据配置文件或注解创建一个Bean的实例。

  2. 属性赋值:Spring容器将配置文件或注解中定义的属性值注入到Bean中。这个过程可以通过构造函数注入、Setter注入或字段注入完成。

  3. BeanNameAware:如果Bean实现了BeanNameAware接口,Spring容器会调用setBeanName方法,将Bean的ID传递给它。

  4. BeanFactoryAware:如果Bean实现了BeanFactoryAware接口,Spring容器会调用setBeanFactory方法,将BeanFactory传递给它。

  5. ApplicationContextAware:如果Bean实现了ApplicationContextAware接口,Spring容器会调用setApplicationContext方法,将ApplicationContext传递给它。

  6. BeanPostProcessor:在Bean初始化前,Spring容器会调用BeanPostProcessor接口的postProcessBeforeInitialization方法。这允许开发者在Bean初始化之前对其进行修改或处理。

  7. 初始化:如果Bean实现了InitializingBean接口,Spring容器会调用其afterPropertiesSet方法。如果配置了自定义的初始化方法,Spring容器也会调用它们(通过init-method属性配置)。

  8. BeanPostProcessor:在Bean初始化后,Spring容器会再次调用BeanPostProcessor接口的postProcessAfterInitialization方法。这同样允许开发者在Bean初始化之后进行处理。

  9. 就绪:Bean现在已经完全初始化,可以被应用程序使用。

  10. 销毁:当Spring容器关闭时,Spring会处理Bean的销毁。如果Bean实现了DisposableBean接口,Spring容器会调用其destroy方法。如果配置了自定义的销毁方法,Spring容器也会调用它们(通过destroy-method属性配置)。

代码如下:

package com.blog.test;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * bean的生命周期
 */

@Component
public class TestBeanLife implements BeanFactoryAware,BeanNameAware, BeanPostProcessor,ApplicationContextAware, InitializingBean, DisposableBean {

    private String beanName;
    private ApplicationContext applicationContext;

    public TestBeanLife() {
        System.out.println("1. Bean实例化");
    }

    @Override
    public void setBeanName(String name) {
        this.beanName = name;
        System.out.println("2. BeanNameAware:设置Bean的名称:" + name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
        System.out.println("4. ApplicationContextAware:设置ApplicationContext");
    }


    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("3. BeanFactoryAware setBeanFactory");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("7. InitializingBean:属性赋值后初始化");
    }

//    @Override
//    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//        System.out.println("4. BeanPostProcessor:postProcessBeforeInitialization,Bean名称:" + beanName);
//        return bean; // 可以修改bean或者返回原bean
//    }
//
//    @Override
//    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//        System.out.println("8. BeanPostProcessor:postProcessAfterInitialization,Bean名称:" + beanName);
//        return bean; // 可以修改bean或者返回原bean
//    }

    //自定义初始化方法
    @PostConstruct
    public void customInit() {
        System.out.println("6. 自定义初始化方法");
    }

    //自定义销毁方法
    @PreDestroy
    public void customDestroy() {
        System.out.println("10. 自定义销毁方法");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("11. DisposableBean:销毁");
    }
} 

启动应用:

1. Bean实例化
2. BeanNameAware:设置Bean的名称:testBeanLife
3. BeanFactoryAware setBeanFactory
4. ApplicationContextAware:设置ApplicationContext
6. 自定义初始化方法
7. InitializingBean:属性赋值后初始化

关闭应用:

10. 自定义销毁方法
11. DisposableBean:销毁