橙小张的Java后端学习之路架构&设计&技术我爱编程

Spring IOC源码学习(一):基本概念

2017-09-17  本文已影响115人  橙小张

一、Spring IOC基本概念

在容器本身中,这些bean定义被表示为BeanDefinition 对象,其中包含(以及其他信息)以下元数据:

元数据(Configuration Metadata)

image.png

二、ClassPathXmlApplicationContext层次结构

上面的一些概念应该可以对Spring Container有了一点理论支持,简单的来说,Spring容器就是一个Map,Map中存放的是类和实例的对应关系,但是Spring本身的健壮性和复杂性,不可能单纯的就是一个Map,下图是Spring容器的一个层次关系图,只列出了一些必要的属性,主要的结构就是Context-->BeanFactory-->BeanDefinition,之后的分析也主要会按照这几个类来分析。


context.png
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-ioc.xml");

通过上面代码可以获取到Context的结构:

1、ApplicationContext

image.png

2、BeanFactory

image.png

3、BeanDefinition

image.png

看了这么多的属性越来越看不懂了,但是可以换个思路,把Spring容器当做一个屋子,你屋里面所有的东西都是一个Bean,你的手机,插线板,数据线都是一个Bean,他们之间存在相互依赖的关系,你先给你手机充电,你得知道一些信息,比如:

SpringContext也是一样,如果需要利用Bean,也是需要以很多的上下文信息和Bean的信息,Bean说到底还是一个Class的实例,那实例信息肯定是必不可少的,那实例信息是什么呢?就是实例化赋予该对象的值,就像上图中的beanClass,除此之外,就是一些Bean和Bean的关系,BeanA依赖BeanB,那么dependsNo就派上用场了,Spring将这些配置信息放在了XML中或者是JavaConfig中,就得有这些数据源(source)的信息,那么也就有了resource属性,这里只说了其中的一些,还有很多属性,在之后使用到的时候再具体说。

UserService userService = context.getBean("userService", UserService.class);

这里就要介绍一个关键的接口了,Spring中的一个原则就是面向接口编程,接口定义规范,子类实现规范,学习Spring,就得先从接口开始。

beanFactory.png

可以看到BeanFactory很简单,这也符合Spring的设计原则,对外接口简单,实现复杂,BeanFactory的方法包含两类,Get和Match,对getBean的重载是为了提供更为丰富提取Bean的方式,从getBaen中也可以看得出一点点东西,那就是入参中包含了Aliases,Class,Object,beanName和beanType或者是他们之间的组合,这也反映出来了Spring内部对于Bean定义的一些规则。
BeanFactory需要注意的一些注释:

image.png

第一个框中意思就是:BeanFactory是一个中央注册中心应用程序组件,并集中应用程序的配置
组件,不再需要单独的对象读取属性文件(也就是说我只需要从context中根据beanName啥的读取Bean实例即可,从各个配置源(如XML)中解析的工作就交给你们ApplicationContext了。
第二个框是说实现了BeanFactory的组件应该尽可能的按照顺序支持Bean的生命周期。

在context.png中描述了一个关键的类,DefaultListableBeanFactory

DefaultListableBeanFactory.png

上面说了从配置源读取并解析Bean是context做的事情,那么context具体交给谁了呢?那就是beanDefinitionMap,既然是个Map,那我们就关心怎么PUT进去和怎么Get出来的。
从DefaultListableBeanFactory类的继承关系中可以看出一点问题:

image.png

BeanDefinitionRegistry,从名字上看是注册BeanDefinition的,具体看下里面的内容:

image.png

这个接口也是提供了一些规范,例如注册,移除,获取,是否包含等功能,这样可以很方便的操作BeanDefinition。

三、总结

这一章的总结就到这,感觉自己想表达很多东西,但是又不知道怎么来组合下,只能顺着自己的思路来了,可能比较乱,但是后面的内容会好一点,多一点源码上的理解和实战,主体思路是这样的:

上一篇 下一篇

猜你喜欢

热点阅读