" />
文章

Spring Bean 的生命周期记录

spring bean 的生命周期记录

  1. 实例化:为 Bean 分配内存空间;
  2. 设置属性:将当前类依赖的 Bean 属性,进行注入和装配;
  3. 初始化:
  4. 执行各种通知;
  5. 执行初始化的前置方法;
  6. 执行初始化方法;
  7. 执行初始化的后置方法。
  8. 使用 Bean:在程序中使用 Bean 对象;
  9. 销毁 Bean:将 Bean 对象进行销毁操作。

一个是每个类的自己控制器

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;

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

@Component
public class BeanLifeComponent implements BeanNameAware {
    public void setBeanName(String s) {
        System.out.println("执行 BeanName 的通知方法");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("执行初始化方法");
    }

    public void use() {
        System.out.println("使用 Bean");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("执行销毁方法");
    }
}

一个是通用的控制器

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("beanLifeComponent")) {
            System.out.println("执行初始化前置方法");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("beanLifeComponent")) {
            System.out.println("执行初始化后置方法");
        }
        return bean;
    }
}

当使用spring boot启动后

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        // 得到上下文对象,并启动 Spring Boot 项目
        ConfigurableApplicationContext context = 
            SpringApplication.run(DemoApplication.class, args);
        // 获取 Bean
        BeanLifeComponent component = context.getBean(BeanLifeComponent.class);
        // 使用 Bean
        component.use();
        // 停止 Spring Boot 项目
        context.close();
    }
}

执行结果

WeChata4200d010fd2cf2a995e10501f8f5041

总结一下

切入bean的生命周期有几个方式

实现BeanNameAware 可以指定类名称

使用@PostConstruct 可以执行初始化方式

使用@PreDestroy可以执行销毁方式

实现BeanPostProcessor可以全局的切入bean的生命周期,会在初始化前后执行

License:  CC BY 4.0