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更为方便。

Spring核心技术(十五)——BeanFactory的更多相关文章

  1. Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例

    Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...

  2. Spring核心技术(五)——Spring中Bean的作用域

    前文概述了Spring的容器,Bean,以及依赖的一些信息,本文将描述一下Bean的作用域 Bean的作用域 当开发者定义Bean的时候,同时也会定义了该如何创建Bean实例.这些具体创建的过程是很重 ...

  3. Spring Boot2(十五):Shiro记住我rememberMe、验证码Kaptcha

    接着上次学习的<Spring Boot2(十二):手摸手教你搭建Shiro安全框架>,实现了Shiro的认证和授权.今天继续在这个基础上学习Shiro实现功能记住我rememberMe,以 ...

  4. 面渣逆袭:Spring三十五问,四万字+五十图详解

    大家好,我是老三啊,面渣逆袭 继续,这节我们来搞定另一个面试必问知识点--Spring. 有人说,"Java程序员都是Spring程序员",老三不太赞成这个观点,但是这也可以看出S ...

  5. (转)Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例

    http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html 这篇文章介绍如何使用 Jpa 和 ...

  6. spring boot(十五)spring boot+thymeleaf+jpa增删改查示例

    快速上手 配置文件 pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 <dependency> <groupId>org.springframework.b ...

  7. Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例

    这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个 Demo 来试试它的效果,越 ...

  8. spring学习 十五 spring的自动注入

    一  :在 Spring 配置文件中对象名和 ref=”id” ,id 名相同使用自动注入,可以不配置<property/>,对应的注解@Autowired的作用 二: 两种配置办法 (1 ...

  9. Spring(十五):通过注解配置 Bean

    在ClassPath中扫描组件 1)组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件: 2)特定组件包含: --- @C ...

  10. Spring学习(十五)----- Spring AOP通知实例 – Advice

    Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...

随机推荐

  1. python 修改xml文件

    在百度知道里面有人问了这么一个问题: 有一个xml文件:<root>text <a/> <a/> ...这里省略n个<a/> <root>想 ...

  2. Linq to Sql 左连接 , 取右表可能为 null的 int类型字段

    linq to sql , linq to entity 遇到一个问题, 主表, 从表 一对一 关系,  主表有记录, 从表 可能没有记录. 现在要查询 主表+从表 的某几个字段. 从表字段 有的是 ...

  3. django choice字段模板展示

    class UserInfo(AbstractUserInfo): """ 用户表 """ gender_choice = ( (1,&qu ...

  4. do..while(false)的用法总结

    首先要注意: do..while(0) 代表do里面的东西至少被执行一次,在这里仅仅执行一次. 此种用法有三个用处: 代替{}代码块,实现局部作用域.在某些宏定义时非常有用: #define f(x) ...

  5. chromedp下载文件的方法,备忘一下。

    sect := `//a[@href="v/443.json"]` wd,_ := os.Getwd() fmt.Println(wd) return chromedp.Tasks ...

  6. 自定义报告,用Java写一个html文件

    因为testng不满足我们的展示,所以我们会自己定义一个报告,实施步骤是,把静态页面做好后,放在Java项目中,其实和生成一个日志文件类似,只是该了后缀,Java中需要使用到PrintStream,案 ...

  7. mysql的慢查询实战+sql优化

    背景:使用A电脑安装mysql,B电脑通过xshell方式连接,数据内容我都已经创建好,现在我已正常的进入到mysql中 步骤1:设置慢查询日志的超时时间,先查看日志存放路径查询慢日志的地址,因为有慢 ...

  8. jade简介

    模板引擎:将动静部分糅合的一种实现机制或者技术 var items = [ {title:'..',photo:'http://',id:1,desc:'a'}, {title:'..',photo: ...

  9. @RequestMapping,@ResponseBody,@RequestBody用法

    本文转载:http://blog.csdn.net/ff906317011/article/details/78552426 1.@RequestMapping 国际惯例先介绍什么是@RequestM ...

  10. python 将表格多个列数据放到同一个单元格中

      表格模板: 目的将卡片1到卡片5的所有数据组合起来到一个单元格中如下入F列中(工作中为了避免手动复制粘贴),其余不变,因为数据太多 自己一个一个复制工作效率太低,所以写这个脚本是为了方便自己有需要 ...