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. OpenGL 实现Interpolation插值算法

    这是一个静态插值算法的效果,图形学中插值算法应用十分广.如动画.photoshop, autocAD等软件画曲线,还有shader中的渐变上色也是一个硬件支持的插值算法. Interpolation是 ...

  2. PHP上传文件(学习)

    <?php if(isset($_FILES['upfile'])) { if (is_uploaded_file($_FILES['upfile']['tmp_name'])){ $upfil ...

  3. C#开发中使用配置文件

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  4. 如何定义AIDL跨进程间通信

    当进程A要去调用进程B中的service时,并实现通信,我们通常都是通过AIDL来操作的 projectA: 首先在我们自己的包com.wzp.aidlservice中创建一个RemoteServic ...

  5. cocos2dx 制作单机麻将(二)

    cocos2dx 制作单机麻将(二) 打乱麻将顺序2 前面解说了怎样打乱初始给定的麻将牌堆, 另一种是打乱随意给定的麻将牌堆 //混乱扑克2 void RandAppointCardData(BYTE ...

  6. [置顶] 纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!

    前两天写的文章<纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!>受到很多网友的喜爱,今天特别推出姊妹篇<纯手工打造漂亮的瀑 ...

  7. HTML5游戏开发引擎Pixi.js完全入门手册(一)框架简介及框架结构分析,作者思路剖析

    前言: 最近无聊在淘宝弄了个小店,打算做一个兼职.遇到一个客户,要我帮忙拷贝一个html5游戏.. 我这人有一个习惯,拿到自己没见过的东西.都会去研究一番.去网上查了下发现,资料都是英文版.感觉极度不 ...

  8. typeof + instanceof+toString+constructor什么推理javascript数据类型

    一个.typeof JS这些变量是弱类型(这是弱类型)的,它可以不管用来存储数据的类型的. typeof 数据类型可用于检测给定的变量.可能的返回值: 1. 'undefined' --- 这个值没有 ...

  9. 第19章 解释器模式(Interpreter Pattern)

    原文 第19章 解释器模式(Interpreter Pattern) 解释器模式 导读:解释器模式,平常用的比较的少,所以在写这个模式之前在博客园搜索了一番,看完之后那叫一个头大.篇幅很长,我鼓足了劲 ...

  10. NET动态调用WebService

    NET动态调用WebService 这不是一篇教你了解WebService的博文,也不是对WebService的深入理解, 这是一篇教你在开发过程中,如果动态的调用WebService一个方法. 在比 ...