Spring学习
1、BeanFactory 和 FactoryBean 和 BeanDefinition
BeanDefinition是Bean的定义。BeanFactory是Bean容器顶层接口。FactoryBean是用来创建Bean的,实现此接口的getBean方法可以通过此FactoryBean的名字获得Bean,如果想获得他本身则要转移&。
2、容器
简单容器接口
DefaultListableBeanFactory中有重要成员属性——beanDefinitionMap
Map of bean definition objects, keyed by bean name.
高级容器接口
ApplicationContext继承全部简单容器,AbstractApplicationContext实现了大部分重要内容,其下的容器是大多数时候用的容器。
3、资源访问
3-1 Resource、ResourceLoader
Resource接口是 Spring 资源访问 策略的抽象。 AbstractResource实现了Resource大部分实现。
ClassPathResource默认去 编译后文件目录中的 WEB-INF/classes下。
ResourceLoader 实现不同的Resource加载策略,按需返回特定类型的Resource。
策略模式,Resource下三个策略,通过DefaultResourceLoader getResource方法决定使用那个策略。
PathMatchingResourcePatternResolver 是ResourceLoader的装饰器。支持多配置文件加载 Ant风格。
AbstractApplicationContext 聚合 PathMatchingResourcePatternResolver 继承 DefaultResourceLoader
3-2 使用者BeanDefinitionReader
作用:读取BeanDefinition 并最终 通过BeanDefinitionRegistry 注册到容器。
BeanDefinitionReader定义了一系列加载配置文件成为BeanDefinition的接口
ApplicationContext会视情况使用其中一个加载资源方法 读取配置资源,将读取的内容解析Document对象再解析为bdHolder(BeanDefinition包装类)再解析为BeanDefinition 注册进容器。
AbstractBeanDefinitionReader中实现的loadBeanDefinitions方法会使用ResourceLoader或者ResourcePatternResolver来加载资源。
4、BeanDefinition的注册
BeanDefinitionRegistry中registryBeanDefinition方法将BeanDefinition注册进容器。
所谓注册就是将BeanDefinition放入DefaultListableBeanFactory的成员属性beanDefinitionMap中。
5、PostProcessor、Aware、事件监听器。
5-1 后置处理器
本身也是一种需要注册到容器中的Bean。 其里面的方法会在特定的时间被容器调用。
实现不改变容器或者Bean核心逻辑的情况下,对Bean做扩展。
对Bean进行包装,影响其行为、修改Bean的内容等,甚至替换。
种类:
容器级别的:BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor
Bean级别的:BeanPostProcessor
两个方法 Bean初始化之前,和Bean创建之后。
作用:管理Bean的生命周期:Bean实例化--->Bean初始化--->Bean使用中--->Bean销毁
相关的接口:
5-2 Aware
实现相关的接口,可以调用相应的服务。
5-3 事件监听机制
事件源 Event Source
事件监听器 Event Listener
事件对象 Event Object
发布事件 ApplicationEventPublisher / ApplicationEventMulticaster
6、容器初始化
AbstractApplicationContext中的refresh(
7、Bean的创建,依赖注入
refresh()->finishBeanFactoryInitialization()->preInstantiateSingletons()->getBean()->doGetBean()->createBean()->doCreateBean()
此过程非常复杂、调用非常深、做了很多很精细的控制,只看大概,理清脉络,大处着眼。
7-1 doGetBean
7-2 doCreateBean
7-3 循环依赖
7-4 doGetBean 之 polulateBean
本文来自博客园,作者:长寿奉孝,转载请注明原文链接:https://www.cnblogs.com/tyt0o0/p/17983898