Spring Bean 生命周期以及源码分析

本文深入探讨了Spring Bean的生命周期,包括实例化、属性填充、初始化和销毁四个阶段,并介绍了BeanPostProcessor和Aware接口如何增强这些阶段。内容涉及BeanFactory的Bean创建过程,如setter注入、BeanNameAware和BeanFactoryAware接口的应用,以及初始化和销毁方法的调用。源码分析部分讲解了AOP代理对象的创建和解决循环依赖的方法。最后,文章总结了Bean生命周期中的关键知识点,为后续深入学习奠定了基础。
摘要由CSDN通过智能技术生成

生命周期

Bean 生命周期指的是单例模式下, Bean 的创建,应用,销魂的整个过程
在这里插入图片描述
先说结论: Bean 生命周期包含 4 个阶段:实例化、属性填充、初始化、销毁;在这 4 个阶段前后,有 BeanPostProcessor,Aware 等接口对这 4 个阶段进行增强。

一般面试的回答:

  1. BeaFactory 读取 Bean 定义,生成实例(实例化)
  2. setter 属性注入(属性填充)
  3. 若实现 BeanNameAware 接口,执行 setBeanName 方法
  4. 若实现 BeanFactoryAware 接口,执行 setBeanFactory 方法
  5. 若实现 BeanPostProcessor 接口,执行 processBeforeInitialization
  6. 执行 InitializingBean 的afterPropertiesSet()
  7. 执行 init-method (初始化)
  8. 执行 processAfterInitialization
  9. 执行 DisposableBean 的 destroy() 销毁
    10.执行 Bean 定义文件中定义 destroy-method

源码分析

注意:部分代码进行了省略

实例化

实例化的过程就是获取完整 Bean 的过程,其中包含创建 Bean 的代理对象(Spring AOP)以及属性填充两个知识点。

通过 AbstractBeanFactory getBean 方法获取单例模式的 bean,里面调用抽象类AbstractAutowireCapableBeanFactory 的 createBean 方法

@Override
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
   
	public Object getBean(String name) throws BeansException {
   
		return doGetBean(name, null, null, false);
	}
	
	protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
				@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
   
		try {
   
			return createBean(beanName, mbd, args);
		}	
	}
}

createBean 里面有两种 Bean 实例化的方式,基于 AbstractAutowireCapableBeanFactory 类里面的方法进行分析:

  1. 通过调用 resolveBeforeInstantiation 方法,执行 postProcessBeforeInstantiation 返回一个代理的 bean,然后执行 applyBeanPostProcessorsAfterInitialization 方法。

    知识点:Spring AOP 的具体实现

  2. 执行 doCreateBean 进行后面 bean 的实例化

先看第一种方式

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {
   
	@Override
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
   
		try {
   
			// 给 BeanPostProcessors 一个机会返回代理 Bean
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值