(18)BeanFactory
BeanFactory是Spring IoC功能的潜在基础
,但是现在BeanFactory一般仅仅用于直接集成第三方的框架,对于大多数的Spring用户来BeanFactory以及其相关的接口,包括说,BeanFactory已经算是一个历史了
。BeanFactoryAware,InitializingBean,DisposableBean,出于跟大量第三方框架兼容的问题,仍然存在。因为很多时候,第三方组件还不能使用形如@PostConstruct或者@PreDestroy这类的注解,为了继续支持JDK1.4以及避免依赖于JSR-250标准。
下面将描述BeanFactory和ApplicationContext之间的一些异同以及如何通过典型的单例查找访问IoC容器。
1.BeanFactory 还是 ApplicationContext?
最好还是使用ApplicationContext
除非真的有不得不使用BeanFactory的理由。
因为ApplicationContext包含了BeanFactory的所有功能,所以它更优于BeanFactory。只有少数情况
,比如嵌入式应用环境中,运行应用的设备资源受限,内存要求更为严格,仅仅差几k几十k内存开销都会对应用产生影响的情况,才需要权衡是否使用BeanFactory。所以,在绝大多数的典型情况之中,开发者肯定还是使用ApplicationContext最好。Spring在BeanPostProcessor这个扩展点上是重度用户,如果开发者仅仅使用BeanFactory的话,相当多的功能,诸如事务,AOP都将不会生效。这个时候,就会让人很疑惑,因为配置都是正确的。
下表列出了所有BeanFactory和ApplicationContext接口和实现的一些特性:
Feature | BeanFactory | ApplicationContext |
---|---|---|
Bean的实例化和装载 |
支持 | 支持 |
自动的BeanPostProcessor 注册 |
不支持 | 支持 |
自动的BeanFactoryPostProcessor 注册 |
不支持 | 支持 |
MessageSource国际化 |
不支持 | 支持 |
ApplicationEvent的发布 |
不支持 | 支持 |
如果是在BeanFactory的实现下来注册Bean的后置处理器的,需要写如下的代码:
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
// populate the factory with bean definitions
// now register any needed BeanPostProcessor instances
MyBeanPostProcessor postProcessor = new MyBeanPostProcessor();
factory.addBeanPostProcessor(postProcessor);
// now start using the factory
如果是在BeanFactory中明确的注册一个BeanFactoryPostProcessor的话,需要写如下代码:
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(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);
可以看到,上面的两种方式,Bean的注册过程都是相当繁琐的
,这也是为什么要推荐使用ApplicationContext而非BeanFactory的原因。而且,尤其是在需要使用BeanFactoryPostProcessor,BeanPostProcessor以及占位符替换,AOP等功能的时候,ApplicationContext会比BeanFactory更为方便
。
推荐阅读
-
Altium Designer 18(AD18)中文安装+破解详细教程(附破解下载)
-
小米蓝牙耳机发布 售价79元 6月18日10:00 开卖
-
BodyPaint 3D R18怎么安装?BodyPaint 3D R18破解安装图文教程
-
PHP中使用gettext解决国际化问题的例子(i18n)
-
79元 魅族移动电源3发布:双USB/双向18W快充
-
*域名.VIP将于5月18日开放注册 腾讯、谷歌已购入
-
NVIDIA 17年18款旗舰显卡价格大比拼:8800 GTX果然最贵
-
AMD RX 580/570发布时间确定:4月18日
-
chemdraw pro 18如何激活?化学结构式编辑器激活教程
-
同时开抢!8月18日天猫首发小米手环与小米路由器mini