SpringBean最全生命周期

402 阅读2分钟

1、 大概生命周期

  1. 实例化对象(调用构造器new对象)
  2. 属性赋值(比如@Autowired就是在这里处理)
  3. 初始化
  4. 销毁

2、验证bean生命周期

代码准备

TotalAware

public class TotalAware implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, ApplicationContextAware,
InitializingBean {
    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {

    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

    }

    @Override
    public void setBeanName(String name) {

    }

    @Override
    public void afterPropertiesSet() {

    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

    }
}

LifeCycleBean

@Slf4j
@Data
public class LifeCycleBean extends TotalAware {
    private String username;

    public LifeCycleBean() {
        log.info("对象被创建了");
    }

    @Override
    public void setBeanName(String name) {
        log.info("BeanNameAware接口的setBeanName方法执行了{}", name);
    }

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        log.info("BeanClassLoaderAware接口的setBeanClassLoader方法执行了 {}", classLoader);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        log.info("BeanFactoryAware接口的setBeanFactory方法执行了 {}", beanFactory.getClass());
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        log.info("ApplicationContextAware接口的setApplicationContext方法执行了 {}", applicationContext.getClass());
    }

    @PostConstruct
    public void init() {
        log.info("@PostConstruct注解的init方法执行了");
    }

    @Override
    public void afterPropertiesSet() {
        log.info("InitializingBean接口的afterPropertiesSet方法执行了");
    }

    public void initMethod() {
        log.info("init-method方法执行了");
    }

    @PreDestroy
    public void destroy() {
        log.info("@PreDestroy注解的destroy方法执行了");
    }

    public void destroyMethod() {
        log.info("destroy-method方法执行了");
    }
}

AllLifeCycleBeanPostProcessor

@Component
@Slf4j
public class AllLifeCycleBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor {

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (beanClass.equals(LifeCycleBean.class)) {
            log.info("postProcessBeforeInstantiation执行了");
        }
        return SmartInstantiationAwareBeanPostProcessor.super.postProcessBeforeInstantiation(beanClass, beanName);
    }


    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        if (bean.getClass().equals(LifeCycleBean.class)) {
            log.info("postProcessAfterInstantiation执行了");
        }
        return SmartInstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean, beanName);
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean.getClass().equals(LifeCycleBean.class)) {
            log.info("postProcessBeforeInitialization执行了");
        }
        return SmartInstantiationAwareBeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean.getClass().equals(LifeCycleBean.class)) {
            log.info("postProcessAfterInitialization执行了");
        }
        return SmartInstantiationAwareBeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }


    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        if (bean.getClass().equals(LifeCycleBean.class)) {
            MutablePropertyValues propertyValues = new MutablePropertyValues();
            propertyValues.add("username", "qyh");
            log.info("postProcessProperties执行了");
            return propertyValues;
        }
        return SmartInstantiationAwareBeanPostProcessor.super.postProcessProperties(pvs, bean, beanName);
    }
}

BeanConfig

@Configuration
public class BeanConfig {

    @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
    public LifeCycleBean lifeCycleBean() {
        return new LifeCycleBean();
    }
}

启动类

public static void main(String[] args) {
    ConfigurableApplicationContext run = SpringApplication.run(SpringBeanLifeCycleApplication.class, args);
    LifeCycleBean bean = run.getBean(LifeCycleBean.class);
    System.out.println(bean.getName());
    run.close();
}

结果

 c.e.b.b.AllLifeCycleBeanPostProcessor    : postProcessBeforeInstantiation执行了
 c.example.beanLifeCycle.LifeCycleBean    : 对象被创建了
 c.e.b.b.AllLifeCycleBeanPostProcessor    : postProcessAfterInstantiation执行了
 c.e.b.b.AllLifeCycleBeanPostProcessor    : postProcessProperties执行了
 c.example.beanLifeCycle.LifeCycleBean    : BeanNameAware接口的setBeanName方法执行了lifeCycleBean
 c.example.beanLifeCycle.LifeCycleBean    : BeanClassLoaderAware接口的setBeanClassLoader方法执行了 jdk.internal.loader.ClassLoaders$AppClassLoader@36baf30c
 c.example.beanLifeCycle.LifeCycleBean    : BeanFactoryAware接口的setBeanFactory方法执行了 class org.springframework.beans.factory.support.DefaultListableBeanFactory
 c.example.beanLifeCycle.LifeCycleBean    : ApplicationContextAware接口的setApplicationContext方法执行了 class org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
 c.e.b.b.AllLifeCycleBeanPostProcessor    : postProcessBeforeInitialization执行了
 c.example.beanLifeCycle.LifeCycleBean    : @PostConstruct注解的init方法执行了
 c.example.beanLifeCycle.LifeCycleBean    : InitializingBean接口的afterPropertiesSet方法执行了
 c.example.beanLifeCycle.LifeCycleBean    : init-method方法执行了
 c.e.b.b.AllLifeCycleBeanPostProcessor    : postProcessAfterInitialization执行了
 qyh
 c.example.beanLifeCycle.LifeCycleBean    : @PreDestroy注解的destroy方法执行了
 c.example.beanLifeCycle.LifeCycleBean    : destroy-method方法执行了

3、总结


1. 实例化(Instantiation)
-> InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
     -> constructor
-> InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation

2. 属性赋值(polulate)
-> InstantiationAwareBeanPostProcessor#postProcessProperties

3. 初始化(Initialization)
-> invokeAwareMethods
    -> setBeanName
    -> setBeanClassLoader
    -> setBeanFactory
-> ApplicationContextAwareProcessor#postProcessBeforeInitialization#invokeAwareInterfaces
    -> setEnvironment
    -> setEmbeddedValueResolver
    -> setResourceLoader
    -> setApplicationEventPublisher
    -> setMessageSource
    -> setApplicationStartup
    -> setApplicationContext
-> BeanPostProcessor#postProcessBeforeInitialization
    -> @PostConstruct
    -> afterPropertiesSet
    -> initMethod
-> BeanPostProcessor#postProcessAfterInitialization

4. 销毁(Destruction)
     -> @PreDestroy
     -> destroy-method

具体执行流程,可以参考上面的代码,添加断点debug就行。