spring原理探索

饮水思源,探索spring框架原理

1.bean加载

在这里插入图片描述
在这里插入图片描述
大致分为读取解析配置文件–》注册实例化bean–》将bean放到spring容器
1.获取配置文件资源:
通过 ResourceLoader 来完成资源文件位置的定位,DefaultResourceLoader 是默认的实现, 同时上下文本身就给出了 ResourceLoader 的实现,可以从类路径、文件系统, URL 等方式 来定为资源位置。

2.对bean定义信息的解析:
容器通过 BeanDefinitionReader 来完成 bean 定义信息的解析,使 用的是 XmlBeanDefinitionReader 来解析 bean 的 xml 定义文件,实际的处理过程是委托给 BeanDefinitionParserDelegate 来完成的,从而得到 bean 的定义信息,这些信息在 Spring 中 使用 BeanDefinition 对象来表示

3.加载提取bean并注册(添加到beanDefinitionMap中):
IoC 容器 解析得到 BeanDefinition 以后,需要把它在 IoC 容器中注册,这由 IoC 实现 BeanDefinitionRegistry 接口来实现。注册过程就是在 IoC 容器内部维护的一个 HashMap 来保存得到的 BeanDefinition 的过程。这个 HashMap 是 IoC 容器持有 bean 信息的场所, 以后对 bean 的操作都是围绕这个 HashMap 来实现的。

4.bean的初始化:
通过DefaultListableBeanFactory的getBean()方法去初始化,实际由AbstractAutowireCapableBeanFactory的doCreateBean()去完成。

1.spring IOC

任何一个使用spring框架的java应用,通常都会存在一行类似于“context.getBean()”的代码,实际上,这行代码做的就是依赖注入的工作,总结下来有两个阶段:

阶段一:收集和注册
第一个阶段是构建和收集bean定义的阶段,可以通过xml或者java代码定义bean,然后通过手动组装或者自动扫描的形式,将这些bean定义手机到IOC容器中。
假设以xml配置来收集,一般形式如下:
在这里插入图片描述
如果想批量收集并注册到IOC容器,可通过自动扫描:
在这里插入图片描述

阶段二:分析和组装
当第一阶段工作完成后,IOC容器中是一个个独立的bean,它们之间没有任何关系。但实际,它们之间是有依赖关系的,所以第二阶段要做的就是分析然后组装这些bean。
spring最早是通过xml配置文件的形式来描述bean之间的关系的,随着java业界研发技术和理念转变,基于java代码和annotation原信息的描述方式也日渐兴盛(比如@Autowired)。

2.了解JavaConfig

基于javaconfig方式的依赖关系绑定描述基本上映射了xml配置方式,比如:
(1)表达形式层面
xml方式:
在这里插入图片描述
(2)javaConfig形式:
在这里插入图片描述
任何一个标注了@Configuration的java类定义都是一个javaConfig配置类。
(2)注册bean定义层面
xml形式:
在这里插入图片描述
javaConfig形式:
在这里插入图片描述
任何一个标注了@Bean的方法,其返回值作为一个bean定义注册到Spring的IOC容器,方法名默认成为该bean定义的id。
(3)表达依赖注入关系层面
xml形式:
在这里插入图片描述
javaConfig形式:
在这里插入图片描述

3.常见Annotation

(1)@ComponentScan
用于配合一些元信息,比如@Component和@Repository等,将标注了这些元信息annotation的bean定义类批量采集到Spring的IOC容器中。
可以通过basePackages等属性来细粒度定制自动扫描范围,如果不指定则默认从@ComponentScan所在类的package进行扫描。
(2)@PropertySource
用于从某些地方加载*.properties文件内容,并将其中的属性加载到IOC容器中。
(3)@Import和@ImportResource
在xml中,通过的形式将多个分开的容器配置合到一个配置中,在javaConfig形式的配置中,我们使用@Import来完成:
在这里插入图片描述
如果要合并一些xml形式的配置,则可以通过@ImportResource:
在这里插入图片描述