在进入BeanFactory之前,还是先说说IoC容器和IoC Service Provider之间的关系
Spring提供了两个容器:正准备介绍的BeanFactory和ApplicationContext容器
- BeanFactory 基础类型IoC容器,提供完整的IoC服务支持,默认采用lazy-inti初始化方式
适用:资源有限、功能要求不是很严格 - ApplicationContext 在BeanFactory基础之上构建,提供高级特性:事件发布和国际化信息支持
两者准确的关系怎么样的呢:
准确的来说,BeanFactory真正能够改变的东西,就是之前我们想要获取某个对象的时候,是自己去创建,主动寻找获取;而BeanFactory可以将我们需要的依赖推送过来。
通常的话,会通过XML文件来实现这种依赖管理:
<beans>
<bean id="djNewsProvider" class="..FXNewsProvider">
<constructor-arg index="0">
<ref bean="djNewsListener"/>
</constructor-arg>
<constructor-arg index="1">
<ref bean="djNewsPersister"/>
</constructor-arg>
</bean>
...
</beans>
具体的实现:
ApplicationContext container = new ClassPathXmlApplicationContext("配置文件路径");
FXNewsProvider newsProvider = (FXNewsProvider)container.getBean("djNewsProvider"); newsProvider.getAndPersistNews();
这里的调用是通过getBean()方法获取,从这里可以看出spring的具体怎么实现映射。
BeanFactory 只是一个接口,所以具体的使用中,需要使用一个具体实现类实现该接口进行Bean的管理。
可以通过图中的关系结构看出,虽然我们需要的对象都是属于BeanFactory的,实际上使用的对象是在BeanDefinitionRegistry中的,书中的比方就很恰当:BeanFactory相当于图书馆,虽然借书要进图书馆,但是书都放在书架上面,所以图中的BeanDefinitionRegistry就像是图书馆的书架。
Spring提供了org.springframework.beans.factory.support.PropertiesBeanDefinition-Reader类用于Properties格式配置文件的加载,所以提供好配置文件
文中有提到BeanFactory的对象注册和依赖绑定,直接编码格式,这种方式是经历了注册-构造-setter(),最终完成绑定;另一种方式就是基于注解的依赖注入。