BeanFactory概念

Spring通过一个配置文件描述bean和bean之间的依赖关系,然后利用java语言的反射功能实例化bean,并建立bean之间的依赖关系。Spring的IOC容器在完成这些底层工作的基础之上,还提供了bean的实例缓存、生命周期管理、bean的实例代理、bean的发布等等高级服务,那么bean工程,也就是BeanFactory是Spring框架最核心的接口,它提供了高级IoC的配置机制。BeanFactory使管理不同类型的java对象成为了可能。而应用上下文,即ApplicationContext建立在BeanFactory基础之上,提供了更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建实际应用一般成BeanFactory为IoC容器,而称ApplicationContext为应用上下文,但有时为了形容方便,我们也将ApplicationContext称为Spring容器。对于两者的用途,我们可以进行简单的划分,BeanFactory是Spring框架的基础设施,是面向Spring本身的。而ApplicationContext则是面向使用Spring框架的开发者。几乎所有的应用场合,我们都直接使用ApplicationContext,而非底层的BeanFactory。

BeanFactory是一个类工厂,可以创建并管理各种类的对象,Spring称这些创建和管理的Java对象为Bean。在Spring中,Java对象的范围更加宽泛。

类体系结构

XmlBeanFactory

XmlBeanFactory继承自DefaultListableBeanFactory,扩展了从xml文档中读取bean definition的能力。从本质上讲,XmlBeanFactory等同于DefaultListableBeanFactory+XmlBeanDefinitionReader ,如果有更好的需求,可以考虑使用DefaultListableBeanFactory+XmlBeanDefinitionReader方案,因为该方案可以从多个xml文件读取资源,并且在解析xml上具有更灵活的可配置性。

ListableBeanFactory

获取bean时,Spring 鼓励使用这个接口定义的api. 还有个Beanfactory方便使用.其他的4个接口都是不鼓励使用的.

提供容器中bean迭代的功能,不再需要一个个bean地查找.比如可以一次获取全部的bean(太暴力了),根据类型获取bean.在看SpringMVC时,扫描包路径下的具体实现策略就是使用的这种方式(那边使用的是BeanFactoryUtils封装的api).

如果同时实现了HierarchicalBeanFactory,返回值不会考虑父类BeanFactory,只考虑当前factory定义的类.当然也可以使用BeanFactoryUtils辅助类来查找祖先工厂中的类.

这个接口中的方法只会考虑本factory定义的bean.这些方法会忽略ConfigurableBeanFactory的registerSingleton注册的单例bean(getBeanNamesOfType和getBeansOfType是例外,一样会考虑手动注册的单例).当然BeanFactory的getBean一样可以透明访问这些特殊bean.当然在典型情况下,所有的bean都是由external bean定义,所以应用不需要顾虑这些差别.

注意:getBeanDefinitionCount和containsBeanDefinition的实现方法因为效率比较低,还是少用为好.

HierarhicalBeanFactory

提供父容器的访问功能.至于父容器的设置,需要找ConfigurableBeanFactory的setParentBeanFactory(接口把设置跟获取给拆开了!)

ConfigurableBeanFactory

定义BeanFactory的配置.

这边定义了太多太多的api,比如类加载器,类型转化,属性编辑器,BeanPostProcessor,作用域,bean定义,处理bean依赖关系,合并其他ConfigurableBeanFactory,bean如何销毁.

定义了两个作用域: 单例和原型.可以通过registerScope来添加.SCOPE_SINGLETON,SCOPE_PROTOTYPE

AutowireCapableBeanFactory

在BeanFactory基础上实现对已存在实例的管理.

可以使用这个接口集成其它框架,捆绑并填充并不由Spring管理生命周期并已存在的实例.像集成WebWork的Actions 和Tapestry Page就很实用.

一般应用开发者不会使用这个接口,所以像ApplicationContext这样的外观实现类不会实现这个接口,如果真手痒痒可以通过ApplicationContext的getAutowireCapableBeanFactory接口获取.

这边定义了5种自动装配策略:不注入AUTOWIRE_NO,使用bean name策略装配AUTOWIRE_BY_NAME,使用类型装配策略AUTOWIRE_BY_TYPE,使用构造器装配策略AUTOWIRE_CONSTRUCTOR,自动装配策略AUTOWIRE_AUTODETECT。这边的自动策略是先尝试构造器,然后才是byType.这边应该是跟xml配置文件中的装配策略对应.

SingletonBeanFactory

BeanDefinitionRegistry

初始化顺序

创建配置文件

装载配置文件

启动IoC容器

获取Bean实例

参考文章:

出门向左:Spring源码解析 - BeanFactory接口体系解读

一天不进步,就是退步!:spring beans源码解读之--XmlBeanFactory

最新文章

  1. python利用unrar实现rar文件解压缩
  2. 【DP】HDU 1114
  3. WebForm 内置对象
  4. AD域环境的搭建 基于Server 2008 R2
  5. jquery中的replaceWith()和html()有什么区别?
  6. Jtree(节点的渲染+资源管理器)(2)
  7. service and intentservice
  8. 前端是Sencha Touch+ Cordova(转)
  9. idea web项目动态部署
  10. MySQL学习基础知识2
  11. MongoDB操作集
  12. parrotsec 和 kali安装系统的时候出现“executing grub-install dummy”的解决方案
  13. mysql 动态增加列,查找表中有多少列,具体什么列。 通过JSON生成mysql表 支持子JSON
  14. background url base64
  15. P4099 [HEOI2013]SAO
  16. STL版本号简单介绍
  17. Android开发6——布局中的wrap_content和fill_parent以及match_parent
  18. Spring Boot系列教程四:配置文件详解properties
  19. ECS 游戏架构 实现
  20. xcode7 断点失效

热门文章

  1. Android - 开发页面需了解的dip,sp,px知识,以及它们的转换
  2. SQLServer 连接和联合
  3. U深度U盘启动盘制作工具怎么用?U深度U盘启动盘制作工具使用教学
  4. Microsoft EDP(enterprise database protection)选择应用程序在哪里可以访问企业数据
  5. char 与 signed char 和 unsigned char三者之间的关系
  6. IntelliJ IDEA环境使用
  7. P1036 选数
  8. Ubuntu 14.04 VPS安装配置***的方法
  9. HttpHandler(处理程序) 和 HttpModule(托管模块)
  10. convolution,fft, 加速