Spring学习

简单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

 

posted @ 2024-01-24 14:30  长寿奉孝  阅读(6)  评论(0编辑  收藏  举报