Spring源码阅读-02:Spring是如何加载Bean?创建Bean的?Bean生命周期?

01-Spring加载配置Bean信息到创建销毁的全流程

0、容器的准备工作
1、创建容器对象
2、读取配置文件,加载BeanDefinition对象
·····2.1、给容器对象进行某些初始化操作
3、执行BeanFactoryPostProcessor的扩展工作
·····3.1、准备工作
·······(1)注册BeanPostProcessor
·······(2)初始化广播器
·······(3)国际化的相关配置
·······(4)注册监听器
4、对象的实例化操作
5、对象初始化操作:
·······(1)自定义Bean赋值
·······(2)容器对象属性赋值
·······(3)调用BeanPostProcessor的前置处理方法进行扩展
·······(4)调用initMethod方法进行初始化的调用
·······(5)BeanPostProcessor的后置处理方法进行进行扩展

在这里插入图片描述
相关源注释(BeanFactory接口):

/**
 * 	定义获取bean及Bean的各种属性
 * The root interface for accessing a Spring bean container.
 * 	翻译:
 * 		访问Spring Bean容器的根接口
 *	...
 * <p>Bean factory implementations should support the standard bean lifecycle interfaces
 * as far as possible. The full set of initialization methods and their standard order is:
 * 	翻译:Bean工厂接口应该尽可能支持完整的Bean生命周期
 * 		完整的初始化方法和标准清单:
 * <ol>
 * <li>BeanNameAware's {@code setBeanName}
 * <li>BeanClassLoaderAware's {@code setBeanClassLoader}
 * <li>BeanFactoryAware's {@code setBeanFactory}
 * <li>EnvironmentAware's {@code setEnvironment}
 * <li>EmbeddedValueResolverAware's {@code setEmbeddedValueResolver}
 * <li>ResourceLoaderAware's {@code setResourceLoader}
 * (only applicable when running in an application context)
 * <li>ApplicationEventPublisherAware's {@code setApplicationEventPublisher}
 * (only applicable when running in an application context)
 * <li>MessageSourceAware's {@code setMessageSource}
 * (only applicable when running in an application context)
 * <li>ApplicationContextAware's {@code setApplicationContext}
 * (only applicable when running in an application context)
 * <li>ServletContextAware's {@code setServletContext}
 * (only applicable when running in a web application context)
 * <li>{@code postProcessBeforeInitialization} methods of BeanPostProcessors
 * <li>InitializingBean's {@code afterPropertiesSet}
 * <li>a custom {@code init-method} definition
 * <li>{@code postProcessAfterInitialization} methods of BeanPostProcessors
 * </ol>
 *
 * <p>On shutdown of a bean factory, the following lifecycle methods apply:
 * 	翻译:一个bean工厂关闭,生命周期方法应用如下
 * <ol>
 * <li>{@code postProcessBeforeDestruction} methods of DestructionAwareBeanPostProcessors
 * <li>DisposableBean's {@code destroy}
 * <li>a custom {@code destroy-method} definition
 * </ol>
 *	...
 */
public interface BeanFactory {

1,加载Bean的信息(Spring使用者)

我们通过注解或者XML配置文件书写我们类(bean)的信息,这些使我们开发者做的。

2,BeanDefinition(BD对象)

开发者定义Bean信息方式可能有多重,现在除了注解和XMl之外,现在还多了直接使用Java代码编写Bean的信息,不妨碍以后会有更多,所以我们需要有一个统一接口去规范约束这些对象。

(1)BD对象得作用;

BD对象作用,就是将我们自定义Bean的信息,录入。

(2)完整的BD对象:

先录入我们的Bean信息,之后我们还需要经过一系列增强器(PostProcessor)生成一个完整BD对象,这个时候我们,还没有生成Bean对象,我们将完整的BD对象,送入到BeanFactory中。

2,BeanFactory

设计模式:工厂设计模式
BeanFactory接收到完整的BD对象,解析里面Bean信息,通过反射的方法生成Bean对象。

(1)Spring反射创建对象查看路线

在这里插入图片描述

3,Bean生命周期:

在这里插入图片描述

(1)实例化:

开辟内存空间,这个时候我们Bean对象还不是我们写入的Bean信息,而是默认值

(2)初始化:

属性赋值:
在这里插入图片描述

(a)给我们自定义Bean则使用Set方法赋值:

(b)容器对象赋值:

Spring的容器并不是一直就有的,他还需要创建,创建这个过程就是在这里完成

(c)Bean 增强器

具体查看接口:BeanPostProcessor
通过前置增强器和后置增强器扩展Bean对象。

public interface BeanPostProcessor {
	/**前置Bean初始化增强器
	 *
	 */
	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
	/**
	 * 后置增强器
	 */
	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
}

初始化实例

如果没有扩张就调用Init-Method实例化

02-查看其他与Spring相关文章:

Spring全家桶-源码深入学习:目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值