【曹工杂谈】Maven IOC 容器-- Guice内部有什么 (2)

大家看下图,会发现state下有不少字段,主要就有:每个class对应的绑定(value就是这个class的实例化方式)、还有我们代码里配了个切面也在这里;基本上,这里才是真正的容器的各种数据的存放处

【曹工杂谈】Maven IOC 容器-- Guice内部有什么

接下来,我们再看看这个绑定关系的map。key就是对应的接口类,value就是说:怎么去实例化一个这个类型的实例出来,所以呢,guice内部,为了统一,基本把value这部分统一成了一个工厂。如下:

【曹工杂谈】Maven IOC 容器-- Guice内部有什么

而工厂类里是什么样呢?

【曹工杂谈】Maven IOC 容器-- Guice内部有什么

就是包含了对应的实现类的构造器了。

在真正要找容器获取这个HelloInterface的实例时,就可以找到HelloInterfaceImpl的构造函数,从而构造一个实例出来。

不同的binding方式,内部不同的工厂类

当我们配置了一个如下的绑定关系时:

binder.bind(String.class).toInstance("xxx");

此时,内部又是什么样呢?

【曹工杂谈】Maven IOC 容器-- Guice内部有什么

这里,我们发现内部工厂internalFactory的类型,和之前也不太一样了。同时,下图可以看见,工厂内部直接存了这个String实例的值。

【曹工杂谈】Maven IOC 容器-- Guice内部有什么

总之呢,也是保证后续直接就能在容器需要一个String类型实例时,找到“xxx”这个对象返回回去。

从容器中获取

容器初始化好了,怎么获取呢?即如下代码怎么执行呢?

HelloInterface instance = injector.getInstance(HelloInterface.class);

我们稍微跟了下,发现就会走到如下地方,会去查询state内部的显示绑定map。

【曹工杂谈】Maven IOC 容器-- Guice内部有什么

获取到binding后,即取出internalFactory,然后构造/取出对象即可。

【曹工杂谈】Maven IOC 容器-- Guice内部有什么

总结

不知道大家清晰一点了没,希望对大家有帮助。后续会视情况,再看看是否分析构造容器的源码。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsjgw.html