Spring核心技术(十五)——BeanFactory
BeanFactory
是Spring IoC功能的潜在基础,但是现在BeanFactory
一般仅仅用于直接集成第三方的框架,对于大多数的Spring用户来说,BeanFactory
已经算是一个历史了。BeanFactory
以及其相关的接口,包括BeanFactoryAware
,InitializingBean
,DisposableBean
,出于跟大量第三方框架兼容的问题,仍然存在。因为很多时候,第三方组件还不能使用形如@PostConstruct
或者@PreDestroy
这类的注解,为了继续支持JDK1.4以及避免依赖于JSR-250标准。
下面将描述BeanFactory
和ApplicationContext
之间的一些异同以及如何通过典型的单例查找访问IoC容器。
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
更为方便。
Spring核心技术(十五)——BeanFactory的更多相关文章
- Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例
Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...
- Spring核心技术(五)——Spring中Bean的作用域
前文概述了Spring的容器,Bean,以及依赖的一些信息,本文将描述一下Bean的作用域 Bean的作用域 当开发者定义Bean的时候,同时也会定义了该如何创建Bean实例.这些具体创建的过程是很重 ...
- Spring Boot2(十五):Shiro记住我rememberMe、验证码Kaptcha
接着上次学习的<Spring Boot2(十二):手摸手教你搭建Shiro安全框架>,实现了Shiro的认证和授权.今天继续在这个基础上学习Shiro实现功能记住我rememberMe,以 ...
- 面渣逆袭:Spring三十五问,四万字+五十图详解
大家好,我是老三啊,面渣逆袭 继续,这节我们来搞定另一个面试必问知识点--Spring. 有人说,"Java程序员都是Spring程序员",老三不太赞成这个观点,但是这也可以看出S ...
- (转)Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html 这篇文章介绍如何使用 Jpa 和 ...
- spring boot(十五)spring boot+thymeleaf+jpa增删改查示例
快速上手 配置文件 pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 <dependency> <groupId>org.springframework.b ...
- Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个 Demo 来试试它的效果,越 ...
- spring学习 十五 spring的自动注入
一 :在 Spring 配置文件中对象名和 ref=”id” ,id 名相同使用自动注入,可以不配置<property/>,对应的注解@Autowired的作用 二: 两种配置办法 (1 ...
- Spring(十五):通过注解配置 Bean
在ClassPath中扫描组件 1)组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件: 2)特定组件包含: --- @C ...
- Spring学习(十五)----- Spring AOP通知实例 – Advice
Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...
随机推荐
- due to a StackOverflowError. Possible root causes include a too low。。
我们可以用另外的办法来解决这个问题,我们让tomcat不扫描指定的jar包,tomcat就要轻松得多了,org.apache.tomcat.util.scan.StandardJarScanner中定 ...
- Azure进阶攻略丨如何驾驭罢工的Linux虚机网卡?
很多人的生活中,流传着一个屡试不爽,据说可以解决任何问题的百宝锦囊: 所以经常可以听到类似这样的对话: -我的电脑咋上不去网了? -重启一下电脑. -还是不行呢! -重启一下路由器. -怎么还不行-_ ...
- azkaban调度
azkaban调度 1.概述 azkaban是一套调度系统,常用大数据作业调度.azkaban包括web和executor两套程序,web主要完成展示和交互,executor上完成调度和作业提交执行. ...
- 使用C语言来实现模块化
除了C语言以及C++编程语言之外,在其它现在非常流行的开发语言中,比如说:java,php,jsp等等.我们很难想象到缺少标准化的模块管理机制是一件多么可怕的事情.但是这往往也是由C语言本身的设计哲学 ...
- Tensorflow ValueError: Protocol message RewriterConfig has no "layout_optimizer" field
I changed models/research/object_detection/exporter.py line 71/72 from: rewrite_options = rewriter_c ...
- MATLAB/OCTAVE常用命令 cheat sheet
MATLAB cheatsheet http://web.mit.edu/18.06/www/Spring09/matlab-cheatsheet.pdf 清除变量 clear 清屏 clc //cl ...
- Altium_Designer-各种布线总结
1.常规布线:不详细说了,是个人就知道怎么弄.需要说明的是在布线过程中,可按小键盘的*键或大键盘的数字2键添加一个过孔:按L键可以切换布线层:按数字3可设定最小线宽.典型线宽.最大线宽的值进行切换. ...
- react及flux架构范例Todomvc分析
react及flux架构范例Todomvc分析 通过分析flux-todomvc源码,学习如何通过react构建web程序,了解编写react应用程序的一般步骤,同时掌握Flux的单向数据流动架构思想 ...
- Nodejs事件监听模块
nodejs里面是不存在浏览器里面都冒泡,捕获这些行为的,所以Nodejs实现了events这个模块,里面大多数的模块都集成了这个模块,所以events是node模块里面最重要都一个模块,他对外只暴露 ...
- delete分析 引用于 http://www.cnblogs.com/yuzhongwusan/archive/2012/06/14/2549879.html
最近重新温习JS,对delete操作符一直处于一知半解的状态,偶然发现一篇文章,对此作了非常细致深入的解释,看完有茅塞顿开的感觉,不敢独享,大致翻译如下. 原文地址:http://perfection ...