zoukankan      html  css  js  c++  java
  • Spring核心技术(十五)——BeanFactory

    BeanFactory是Spring IoC功能的潜在基础,但是现在BeanFactory一般仅仅用于直接集成第三方的框架,对于大多数的Spring用户来说,BeanFactory已经算是一个历史了。BeanFactory以及其相关的接口,包括BeanFactoryAware,InitializingBean,DisposableBean,出于跟大量第三方框架兼容的问题,仍然存在。因为很多时候,第三方组件还不能使用形如@PostConstruct或者@PreDestroy这类的注解,为了继续支持JDK1.4以及避免依赖于JSR-250标准。

    下面将描述BeanFactoryApplicationContext之间的一些异同以及如何通过典型的单例查找访问IoC容器。

    BeanFactory 还是 ApplicationContext?

    最好还是使用ApplicationContext除非真的有不得不使用BeanFactory的理由。

    因为ApplicationContext包含了BeanFactory的所有功能,所以它更优于BeanFactory。只有少数情况,比如嵌入式应用环境中,运行应用的设备资源受限,内存要求更为严格,仅仅差几k几十k内存开销都会对应用产生影响的情况,才需要权衡是否使用BeanFactory。所以,在绝大多数的典型情况之中,开发者肯定还是使用ApplicationContext最好。Spring在BeanPostProcessor这个扩展点上是重度用户,如果开发者仅仅使用BeanFactory的话,相当多的功能,诸如事务,AOP都将不会生效。这个时候,就会让人很疑惑,因为配置都是正确的。

    下表列出了所有BeanFactoryApplicationContext接口和实现的一些特性:

    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的原因。而且,尤其是在需要使用BeanFactoryPostProcessorBeanPostProcessor以及占位符替换,AOP等功能的时候,ApplicationContext会比BeanFactory更为方便。

  • 相关阅读:
    用友U8 | 【出纳管理】出纳日记账生成的凭证如何删除?
    转载--如何为chart上的点添加标注
    转载--跨域请求CORS和jsonp
    转载--闭包的使用场景
    转载--闭包的优缺点
    转载--对称加密与非对称加密
    转载--XSS漏洞原理和利用
    转载--强缓存与协商缓存
    转载--CSS常见布局
    转载--透过浏览器看HTTP缓存
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461525.html
Copyright © 2011-2022 走看看