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实例化