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. window.open的小技巧分享(转)

    今天再次谈起window.open是因为发现了一个比较好玩的小技巧,详细内容我们稍后详细说明.       聊到window.open,不得不说明一下他的使用方法,主要有两种形式:   window. ...

  2. 一、ExtJS下载使用

    ExtJS下载 4.1 版本号: http://www.sencha.com/products/extjs/download/ext-js-4.1.1/1683 3.4 版本号:http://www. ...

  3. Web Design 再生:UX Design

    高质量的Web 模板,成熟的Design Pattern,人工智能的引用,移动技术的冲击是否标志着Web Design 结束的时代已经到来? Web Design 最终也未避免与“死亡”这个词的关联, ...

  4. 编程获取linuxservercpu、内存和磁盘使用

    proc文件系统简介 /proc文件系统是一个伪文件系统.它是唯一的,其中存储器,如果不采取外部存储空间. 它是文件系统提供了与内核进程进行通信的接口的方法.用程序能够通过/proc得到系统的信息.并 ...

  5. PC结束 Spark 二次开发 收到自己主动,并允许好友请求

    本次Spark二次开发是为了客服模块的开发, 能让用户一旦点击该客服则直接自己主动加入好友.而客服放则需自己主动加入好友,不同弹出对话框进行允许,这方便的广大客服. 如今废话不多说,直接上代码. pa ...

  6. FutureTask解析(转)

    站在使用者的角度,future是一个经常在多线程环境下使用的Runnable,使用它的好处有两个:1. 线程执行结果带有返回值2. 提供了一个线程超时的功能,超过超时时间抛出异常后返回. 那,怎么实现 ...

  7. Round #169 (Div. 2)D. Little Girl and Maximum XOR

    1.首先是要找到一个位置从左至右,作l这一个是0,r这一个是1. 2.实例01011,10100.你将能够找到01111和10000. #include<cstdio> #include& ...

  8. (大数据工程师学习路径)第二步 Vim编辑器----Vim文档编辑

    一.vim重复命令 1.重复执行上次命令 在普通模式下.(小数点)表示重复上一次的命令操作 拷贝测试文件到本地目录 $ cp /etc/protocols . 打开文件进行编辑 $ vim proto ...

  9. MVC — 第 6 天

    7 天玩转 ASP.NET MVC — 第 6 天   目录 第 1 天 第 2 天 第 3 天 第 4 天 第 5 天 第 6 天 第 7 天 0. 前言 欢迎来到第六天的 MVC 系列学习中.希望 ...

  10. java RC4加密和解码

    package com.*; public class RC4 { public static String decry_RC4(byte[] data, String key) { if (data ...