首页 > 其他分享 >SpringBean生命周期

SpringBean生命周期

时间:2022-11-21 16:22:30浏览次数:52  
标签:初始化 生命周期 通过 接口 SpringBean bean refresh

SpringBean生命周期(~)

简述:

实例化(instantiateBean) —— 属性赋值(populateBean)—— 初始化(init) —— 销毁(destroy)

详细:

创建bean

  1. 通过xml/注解@(Bean)。。等等方式注册bean
    他们都是在spring的 **application中的refresh方法**中用loadBeanDefinitions进行加载
//SpringApplication下的
import org.springframework.boot.SpringApplication; 
SpringApplication类中 refresh方法
protected void refresh(ConfigurableApplicationContext applicationContext) {
        applicationContext.refresh();
    }
底层调用的是 public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {} 中的refresh方法
  1. 通过BeanDefinitionRegistry 通过BeanFactory和Registry进行后置处理
    获得一个SpringBean的一个BeanDefinition对象
    (有两个关键的属性:BeanName和BeanType
  2. 进行提前初始化调用getBean()方法

实例化(instantiateBean)

传入一个BeanName 通过 beanname去找到Bean对应的BeanType,通过反射 返回一个Object对象——也就是bean对象

BeanPostProcessors 代理 的注册功能,方便后期bean的一个拓展 (他是一个拓展点)

// Give BeanPostProcessors a chance to neturn a proxy instead of the target bean instance.
给BeanPostProcessors一个机会,将代理替换为目标bean实例。
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
			if (bean != null) {
				return bean;
			}

// 拓展点,如何替换之前的bean?

  1. 通过BeanDefinitionRegistry

    我们通过拿到BeanDefinitionRegistry对象,然后remove掉之前的bean的BeanDefinition对象,然后去注册我们自己的一个实现类的BeanDefinition
    
  2. 通过PostProcessors

通过PostProcessors判断是不是我们的beanname,然后return一个代理类

属性赋值 populateBean

  • set
  • construct
  • @Resource autowireByName
  • @AutoWire autowireByType
    • 如果通过@AutoWire注入的时候有两个想同类型的bean,我们就要结合@Qualifier("BeanName")注入想要的bean
  • 三级缓存解决循环依赖的问题
    • 有aop的前提。

初始化(initializeBean)

调用三个aware方法

  • BeanNameAware
  • BeanFactoryAware
  • ApplicationContextAware

BeanPostProcessor处理(拓展点)

而该接口下有两个方法
一个是前置处理postProcessBeforeInitialization
一个是后置处理postProcessAfterInitialization

里面的Init-Method (去实现相关接口)

其中 InitializingBeanj接口就是属于InitMethod

销毁(destroy)

与初始化相似

实现DisposableBean接口

调用destroy-method方法 (去实现相关接口)

注:

其中很多中间件框架的一些代码实现都是在实现InitializingBeanDisposableBean两个接口的时候进行

Bean生命周期

标签:初始化,生命周期,通过,接口,SpringBean,bean,refresh
From: https://www.cnblogs.com/maomao777/p/16597303.html

相关文章