spring bean生命周期

目录

bean生命周期

bean代码分析

额外备注api

四个阶段进行验证


bean生命周期

生命周期主要划分为实例化、属性注入、初始化、销毁四个主要部分,验证周期作业,也主要验证这四个阶段的代码。

beanfinition ->
实例化bean(构造方法)->
属性注入->
初始化->
销毁。

bean代码分析

根据refresh方法进行分析bean对象
org.springframework.context.support.AbstractApplicationContext#refresh
根据此代码片段分析生命周期
代码中例如:
public void refresh() throws BeansException, IllegalStateException {
        Object var1 = this.startupShutdownMonitor;
        synchronized(this.startupShutdownMonitor) {
            this.prepareRefresh();
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            this.prepareBeanFactory(beanFactory);

            try {
                this.postProcessBeanFactory(beanFactory);
                this.invokeBeanFactoryPostProcessors(beanFactory);
                this.registerBeanPostProcessors(beanFactory);
                this.initMessageSource();
                this.initApplicationEventMulticaster();
                this.onRefresh();
                this.registerListeners();
                this.finishBeanFactoryInitialization(beanFactory);
                this.finishRefresh();
            } catch (BeansException var9) {
                ...
            } finally {
                ...
            }

        }
    }
主要分为13个api
1. prepareRefresh()
该方法用于容器状态设置,初始化属性设置,检查必备属性是否存在

2. obtainFreshBeanFactory()
该方法主要设置beanFactory序列号id和获取beanFactory

3. prepareBeanFactory(beanFactory)
该方法主要做一些设置工作,设置beanFactory一些属性、添加后置处理器、设置忽略的自动装配接口、设置 ClassLoader、设置 SpEL 表达式解析器,、加忽略注入的接口、注册一些组件

4. postProcessBeanFactory(beanFactory)
模板方法,子类重写已在BeanFactory完成创建后做进一步设置,比如环境下:在BeanFactory创建后添加一些web环境的作用域,环境配置信息,增加一些web环境的组件
StaticWebApplicationContext实现

5. invokeBeanFactoryPostProcessors(beanFactory)
调用BeanDefinitionRegistryPostProcessor实现向容器内添加bean的定义
调用BeanFactoryPostProcessor实现向容器内bean的定义添加属性

6. registerBeanPostProcessors(beanFactory)
该方法是注册 Bean 的后置处理器,找到BeanPostProcessor的实现,排序后注册进容器内

7. initMessageSource()
初始化国际化相关属性

8. initApplicationEventMulticaster()
初始化事件广播器,并放入 applicationEventMulticaster bean 中

9. onRefresh()

10. registerListeners()
添加容器内事件监听器至事件广播器中,派发早期事件

11. finishBeanFactoryInitialization(beanFactory)
实例化所有剩余的非懒加载单例,比如invokeBeanFactoryPostProcessors方法中根据各种注解解析出来的类,在这个时候都会被初始化。实例化的过程各种BeanPostProcessor开始起作用

12. finishRefresh()
初始化生命周期处理器,调用生命周期处理器onRefresh方法,发布ContextRefreshedEvent事件,JMX相关处理

13. resetCommonCaches()
清空产生的缓存数据
总的来着,根据api调用,

1-4,理解为bean的实例化创建对象,

5-11,理解为bean的初始化配置,加载配置,

12,这一步可以理解为bean对象交给spring了(对象的生命周期后续就受容器控制了),
第

13,加载过程中,触发异常,清除缓存中的bean信息

额外备注api

BeanNameAware setBeanName 设置bean名称
BeanClassLoaderAware setBeanClassLoader 设置bean类加载器
BeanFactoryAware setBeanFactory 设置bean工厂
EnvironmentAware setEnvironment 设置环境:profiles+properties
EmbeddedValueResolverAware setEmbeddedValueResolver 设置嵌入式值解析器
ResourceLoaderAware setResourceLoader 设置资源载入器,只适用于在应用程序上下文中运行
ApplicationEventPublisherAware setApplicationEventPublisher 注入应用事件发布器 ApplicationEventPublisher
MessageSourceAware setMessageSource 设置国际化支持
ApplicationContextAware setApplicationContext 设置应用上下文
ServletContextAware setServletContext 设置 servlet 上下文
BeanPostProcessors postProcessBeforeInitialization 执行 bean 处理器前置方法
InitializingBean afterPropertiesSet 执行初始化 Bean 设置完属性后置方法
a custom init-method definition 执行自定义初始化方法
BeanPostProcessors postProcessAfterInitialization 执行 bean 处理器后置方法
销毁顺序:

DestructionAwareBeanPostProcessors postProcessBeforeDestruction 销毁处理器的前置方法
DisposableBean destroy Bean销毁回调方法
a custom destroy-method definition 用户自定义销毁方法

四个阶段进行验证

实例化bean(构造方法)->
属性注入->
初始化->
销毁。
package com.gyrx.lifecycle.task3.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.stereotype.Component;

/**
 * 作业3,深刻理解bean的生命周期,并撰写验证点
 * 过滤请求测试
 */
@Component
public class BeanValid implements BeanFactoryAware, BeanNameAware, InitializingBean,DisposableBean {

    private String gyrxName;

    private String gyrxCode;

    public String getGyrxName() {
        return gyrxName;
    }

    BeanValid(){
        System.out.println("验证一:bean对象 实例化加载操作");
    }

    public void setGyrxName(String gyrxName) {
        //此处不会打印,没有操作属性注入测试类
        System.out.println("验证二:bean对象 属性赋值");
        this.gyrxName = gyrxName;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        gyrxCode = "gyrx";
        //bean记载完成后,初始化配置,例如可以做一些查询数据库、赋值对象等等
        System.out.println("验证三:初始化bean后,加载业务配置");
    }

    @Override
    public void destroy() throws Exception {
        //bean销毁时,做的特殊处理,例如:如果此bean对象里有线程池,可以在这里进行线程停止
        System.out.println("验证四:注销bean对象,特殊操作");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        //bean工厂
        System.out.println("beanFactory是否以及加载此bean对象"+beanFactory.containsBean("beanValid"));
    }

    @Override
    public void setBeanName(String s) {
        //bean id
        System.out.println("bean对象名称:"+s);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值