BeanFactory提供了SpringIOC功能的基础但是它只是直接在用在和第三方框架的整合中,而且现在对于大部分的Spring用户来讲这一句成为了过去。BeanFactory和相关的接口,例如BeanFactoryAware、InitializingBean、DisposalBean,仍然在Spring中用于向后的兼容大量的和Spring整合的第三方框架。为了和JDK1.4保存兼容或者避免依赖JSR-250,通常第三方的组件不能做到完全意义上的等价,比如 @PostConstruct 或者 @PreDestroy。

这部分谈到了BeanFactory和AppliationContext中的背景不同和通过单例查找中直接的访问IOC容器。

1.BeanFactory还是ApplicationContext?

除非你有更好的理由不去使用它,否则就使用ApplicationContext。

因为ApplicationContext包含了BeanFactory所有的功能,只有在用一些很少的方案中才会建议是BeanFactory,例如当内存计算很关键的Applet中,或者一些额外的千字节可能有作用的地方。但是,对于大部分的企业级应用和系统中,ApplicationContext就是你想使用的那个。如果你只是使用了普通的BeanFactory,大量的例如事务和AOP就不会起作用,至少在没有其他额外的作用下不会起作用。这种方法可能会让你疑惑因为没有东西会在配置中出错。

下面的表格中的功能就是BeanFactory和ApplicationContext接口提供和实现的:

功能 BeanFactory ApplicationContext
Bean的实例化
自动的BeanPostProcessor注册
自动的BeanFactoryPostProcessor注册
可用的MessageSource(国际化)
ApplicationEvent发布

为了显示的用一个BeanFactory实现来注册一个bean post-processor,你必须像这样来处理代码:

ConfigurableBeanFactory factory = new XmlBeanFactory(...);
// now register any needed BeanPostProcessor instances
MyBeanPostProcessor postProcessor = new MyBeanPostProcessor();
factory.addBeanPostProcessor(postProcessor);
// now start using the factory

为了在使用一个BeanFactory实现的时候显示的注册一个BeanFactoryPostProcessor,你需要这样做:

XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
// bring in some property values from a Properties file
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new FileSystemResource("jdbc.properties"));
// now actually do the replacement
cfg.postProcessBeanFactory(factory);

在上面的两个例子中,显示的注册都是不可用的,这也是在大部分的基于Spring的引用中,特别是当使用BeanFactoryPostProcessors 和BeanPostProcessors的时候为什么不同的ApplicationContext的实现是相对于普通的BeanFactory更愿意被使用的原因之一。

2.耦合代码和邪恶的单例

最好是以一种DI的风格来写大部分的应用代码在SpringIOC容器的外部,这样在它被创建的时候它就会拥有容器提供的自己的依赖,而且不会通知容器。但是对于一小部分耦合的代码有时候需要将其他的代码绑定在一起,你有时候需要通过一个单例来访问Spring的IOC容器。例如,第三方框架可能不适用Spring IOC容器获取对象的能力而直接构建对象。如果通过第三方框架代码构建的对象是一个小的代理,它就会使用单例去访问Spring IOC容器去获取真实代理的对象,然后控制反转对于大部分的代码还是有作用的。所以大部分的代码任务不告诉容器或者它是怎么访问的,而且仍然和其他的代码实现解耦。EJBs坑内使用这个代理的方式去委托给一个普通的实现的java对象,或者从一个Spring IOC容器检出的对象。尽管Spring IOC容器可能是自己没有必要是单例,但是就内存使用和每一个bean使用它自己的分单例的Spring IOC容器的实例化次数而言,这个可能是不现实的。

以服务定位器的方式来查看应用上下文是访问共享spring管理的组件的唯一选项,比如EJB2.1环境,或者是当你想通过WAR文件共享一个单独的ApplicationContext作为WebApplicationContext的父类。

Spring IOC之BeanFactory的更多相关文章

  1. 【Spring IoC】BeanFactory 和 ApplicationContext(五)

    一.BeanFactory容器 BeanFactory 容器是一个最简单的容器,它主要的功能是为依赖注入 (DI) 提供支持,这个容器接口在 org.springframework.beans.fac ...

  2. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring IoC容器BeanFactory和ApplicationContext

    IoC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建.Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring ...

  3. spring——IOC容器BeanFactory和ApplicationContext对比

  4. 【Spring】Spring IOC原理及源码解析之scope=request、session

    一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...

  5. spring IOC简单分析

    Spring IOC 体系结构 BeanFactory(BeanFactory 里只对 IOC 容器的基本行为作了定义,根本不关心你的 bean 是如何定义怎样加载的.正如我们只关心工厂里得到什么的产 ...

  6. Spring IOC容器分析(1) -- BeanFactory

    搭建好源码阅读环境后,就可以慢慢走进Spring殿堂了.IOC是Inversion of Control的缩写,控制反转的意思.很多人可能都知道IOC是spring的核心,将对象的创建初始化等权限交由 ...

  7. spring揭密学习笔记(3)-spring ioc容器:Spring的IoC容器之BeanFactory

    1. Spring的IoC容器和IoC Service Provider的关系 Spring的IoC容器和IoC Service Provider所提供的服务之间存在一定的交集,二者的关系如图4-1所 ...

  8. spring ioc beanfactory 关系图

    spring security类关系图 mybatis-spring源码解析类关系图 Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析 转: sprin ...

  9. Spring IOC 源码简单分析 01 - BeanFactory

    ### 准备 ## 目标 了解 Spring IOC 的基础流程 ## 相关资源 Offical Doc:http://docs.spring.io/spring/docs/4.3.9.RELEASE ...

随机推荐

  1. C++ Primer 学习笔记_41_STL实践与分析(15)--先来看看算法【下一个】

    STL实践与分析 --初窥算法[下] 一.写容器元素的算法 一些算法写入元素值.在使用这些算法写元素时一定要当心.必须.写入输入序列的元素 写入到输入序列的算法本质上是安全的--仅仅会写入与指定输入范 ...

  2. 上传文件块client实现

    首先由内容阻止所有文件(块大小的约束),然后对于每一个chunk构造单独的一个UDP 数据报进行传输,在应用层的開始是自己定义的包头,有块号,块长度,块指纹等元数据信息,这些信息便于接收端可以按序正确 ...

  3. Ajax基础知识(一)

    随便在百度谷歌上输入Ajax都会出现一大堆的搜索结果,这已经不再是什么新奇的技术了.但若从一开始就学习了ASP.Net,使用功能齐全的Visual Studio集成开发工具,或许未必能对访问一个动态网 ...

  4. MYSQL 优化指南

    数据库设计原则   标准化和规范化 数据库设计范式(3NF)   第一范式 数据属性唯一标示 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关 ...

  5. java多线程检测可用IP

    最近有一个问题进行系统性能优化的时候来到.解析分享给大家后,. 我们socket当建立连接,假设我们不能将计算机连接到指定的站点,那么这将导致系统卡socket的connect在此方法. 我们都知道s ...

  6. 如何将linux用在开发环境中的

    如何将linux用在开发环境中的 1.我为什么要写这篇文章 一直想深入学习一下linux的使用,于是将家里的笔记本装了linux系统,但是要将自己的系统打造一个适合开发的环境确实是一件费心费力的事,而 ...

  7. 打造简易可扩展的jQuery/CSS3 Tab菜单

    原文:打造简易可扩展的jQuery/CSS3 Tab菜单 今天我们利用jQuery和CSS3来打造一款简易而且扩展性强的Tab菜单,这款Tab菜单在切换时也有滑块的效果,先来看看效果图: 由与Tab菜 ...

  8. hdu 1700 Points on Cycle 水几何

    已知圆心(0,0)圆周上的一点,求圆周上另外两点使得三点构成等边三角形. 懒得推公式,直接用模板2圆(r1=dist,r2=sqrt(3)*dist)相交水过 #include<cstdio&g ...

  9. Android4.4 Framework分析——startService创建过程

    我们经常使用context.startService()要启动service.下面就来分析这service启动过程,下图是service启动序列图: watermark/2/text/aHR0cDov ...

  10. hdu Color the ball

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 树状数组的  update的应用,逆序更新 代码: #include <stdio.h&g ...