Spring
- Spring容器,通常指的是ApplicationContext体系结构;即整个Spring框架的IOC功能,是通过ApplicationContext接口的实现类来为应用程序服务的,应用程序通过ApplicationContext的方法来间接与Bean工厂交互,如获取Bean对象实例等
- ApplicationContext的顶层接口正是beanFactory;因此,Spring容器的本质也可以理解为bean工厂(beanFactory,或者bean容器),它按照我们的要求,生产需要的各种bean;在生产bean的过程中,为了解决bean之间的依赖问题,才引入了依赖注入(DI)这种技术;也就是说依赖注入是beanFactory生产bean时为了解决bean之间的依赖的一种技术而已
BeanDefinition
protected AbstractBeanDefinition(BeanDefinition original) {
setParentName(original.getParentName());
setBeanClassName(original.getBeanClassName());
setScope(original.getScope());
setAbstract(original.isAbstract());
setFactoryBeanName(original.getFactoryBeanName());
setFactoryMethodName(original.getFactoryMethodName());
setRole(original.getRole());
setSource(original.getSource());
copyAttributesFrom(original);
// 此处省略
}
从源码可知,BeanDefinition其实是Bean的一些元数据定义,包括父类名称(parenName)、类名(baenClassName)、作用域(scope)等信息;
通过BeanDefinitionReader获取到BeanDefinition之后,我们再通过BeanDefinitionRegistry将beanDefinition注册到BeanFacory中,存储在BeanFactory的conCurrentHashMap中,key=beanName,Value=BeanDefinition;
那么获取Bean就从conCurrentHashMap中通过BeanName获取对应的Bean信息
如果把bean比作一台车,那么BeanDefinition就像是包含了组成这台车的所有零件+设计说明书+使用说明书等等
BeanDefinitionReader
bean元数据读取器(或可以理解为解析器)
BeanDefinitionReader会从 xml文件;@Component等注解类;@Configuration等配置类,获取BeanDefinition,然后注册到BeanFactory中;
注意,AnnotatedBeanDefinitionReader并没有实现BeanDefinitionReader,此处的BeanDefinitionReader泛指元数据读取器
BeanFactory
即bean工厂,一切开始的源头
在我学习SpringBoot启动的过程中上下文默认加载的是DefaultListableBeanFactory,本文暂时不进行深究,等后期有空闲再来补完;
DefaultListableBeanFactory是
BeanFactory接口体系的默认实现类,提供BeanDefinition的存储map,Bean对象的存储map;
而Bean对象实例的存储map,定义在FactoryBeanRegistrySupport,FactoryBeanRegistrySupport实现了SingletonBeanRegistry接口,而DefaultListableBeanFactory的基类AbstractBeanFactory,继承于FactoryBeanRegistrySupport
BeanFactoryPostProcessor
- BeanFactoryPostProcessor是BeanFactory的后置处理器,BeanFactory创建完成,加载其所包含的所有获取BeanDefinition,但还没有实例化bean之前,执行,具体为调用postProcessBeanFactory方法
- 加载更多的bean元数据
ConfigurationClassPostProcessor,用于从BeanFactory中检测使用了@Configuration注解的类,对于这些类对应的BeanDefinitions集合,遍历并依次交给ConfigurationClassParser,ConfigurationClassBeanDefinitionReader处理,分别是处理与@Configuration同时使用的其他注解和将类内部的使用@Bean注解的方法,生成BeanDefinition,注册到BeanFactory - 对bean元数据进行加工处理
BeanDefinition属性填充&修改,在postProcessBeanFactory方法中,可以对beanFactory所包含的beanDefinitions的propertyValues和构造函数参数值进行修改,如使用PropertyPlaceHolderConfigurer来对BeanDefinition的propertyValues的占位符进行填充与赋值,或者使用PropertyResourceConfigurer获取config文件中属性,对BeanDefinitions的相关属性进行赋值或者值覆盖
BeanPostProcessor
- BeanPostProcessor是bean对象后置处理器,负责对已创建好的bean对象进行加工处理,主要是可以对新创建的bean实例进行修改,提供了一个类似于hook机制,对创建好的bean对象实例进行修改
- postProcessBeforeInitialization,创建完bean实例,在任何初始化方法执行之前,执行该方法
- postProcessAfterInitialization,创建完bean实例,在所有初始化方法执行之后,执行该方法
(未完)
参考资料:
https://blog.csdn.net/u010013...
https://blog.csdn.net/qq_3668...
https://blog.csdn.net/weixin_...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。