`
bolide74
  • 浏览: 83321 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring温故知新(五)Spring的Bean和IoC 容器

阅读更多
如果有仔细研究过前一篇的《Spring温故知新(四)用HashMap写一个自己的Spring IoC简易容器吧!》http://bolide74.iteye.com/blog/1002610,那么这一章将会非常通俗易懂。

一、什么是Bean

Bean的直接意译,叫豆子。如果把一个Java应用程序当作一杯香浓的咖啡,那么Bean也就相当于煮这杯咖啡的咖啡豆,它是煮这杯咖啡的基础。
其实看过前一章的RobotBean代码,就能发现这个所谓的Bean其实就是一个POJO(简单的Java对象),只不过叫法不一样而已。


二、Spring的IoC容器:

      首先要指出的是一些初学者可能会犯的错误,就是把Spring的XML配置文件当成了IoC容器。会犯这种错误是因为在使用Spring的时候一直在操作XML,就容易认为修改XML就是在修改容器内容,就想当然的把XML当做IoC容器了(我一开始就犯这种错误了)。
      事实上XML配置文件,其实是IoC容器的“配置容器”。就相当于前一篇我的IoC容器里的HashMap容器,它们起的作用都是相同的,就是用来配置和管理IoC容器里的所有Bean和它们的属性、需要注入的内容。

      由于最原始的IoC容器叫做BeanFactory,其他容器都是继承了BeanFactory,因此上一篇我在实例化我的IoC容器的时候用了beanFactory的引用变量名。

      BeanFactory是一个接口,实际在使用的时候我们也可以不直接用它,而是用了实现这个接口的两个子类:XmlBeanFactory类、ApplicationContext接口。而这其中用的最多的是ApplicationContext,因为它不仅继承了所有BeanFactory的功能,还扩展了更多实用的功能。

      XmlBeanFactory和ApplicationContext的区别并不仅仅体现在功能的数量,还体现在加载Bean的顺序的不同。
      BeanFactory和XmlBeanFactory这两个IoC容器在实例化以后并没有马上加载XML里配置过的Bean,而是在真正开始调用getBean方法去获取的时候才加载,而如果这个bean在xml里没有正确配置,那么这时候就会抛出异常。
      而ApplicationContext则相反,它在自生被实例化以后,就马上开始加载XML里的所有bean,如果XML配置容器里有一些错误的配置,在这时候就会开始抛出异常了,而不像BeanFactory那样在开始getBean了才抛出异常。

      XmlBeanFactory和ApplicationContext各有优劣,虽然一般用ApplicationContext比较常见,但是在一些特殊情况还是需要XmlBeanFactory这种方式,这就要看具体情况具体分析了。

IoC容器的实例化示例代码可以直接看第一章《Spring温故知新(一)Hello,World!》http://bolide74.iteye.com/blog/993248

这一章比较简单,都是概念性的东西所以也有些枯燥,下一章我将会介绍Spring框架的重中之重,也是它的魅力所在:Spring AOP原理!



下一篇:Spring温故知新(六)AOP面向切面编程 <1> http://bolide74.iteye.com/blog/1007086
上一篇:Spring温故知新(四)用HashMap写一个自己的Spring IoC简易容器吧! http://bolide74.iteye.com/blog/1002610







4
1
分享到:
评论
4 楼 bolide74 2011-05-10  
yuanyu5237 写道
又有一个疑惑,XmlBeanFactory和ApplicationContext实例化bean的时间不同,那我想知道我们再使用spring的时候,它实例化bean(默认)是在什么时候,容器启动阶段,还是(显示或隐式调用)getBean方法的时候,还是说我们可以自己配置bean实例化的时间,希望楼主能解释下,谢谢~~


如果是使用XmlBeanFactory,那么就是在调用getBean方法的时候才实例化一个bean。
而如果是是使用ApplicationContext,那么就是在容器启动阶段就开始实例化所有的bean了。

你可以故意设置一个错误的bean在配置文件里面,然后分别用XmlBeanFactory和ApplicationContext来getBean,再用断点调试一下,就能发现报错的位置并不相同了,这样你会更直观的明白这两种IoC容器的区别
3 楼 yuanyu5237 2011-05-10  
又有一个疑惑,XmlBeanFactory和ApplicationContext实例化bean的时间不同,那我想知道我们再使用spring的时候,它实例化bean(默认)是在什么时候,容器启动阶段,还是(显示或隐式调用)getBean方法的时候,还是说我们可以自己配置bean实例化的时间,希望楼主能解释下,谢谢~~
2 楼 bolide74 2011-04-29  
C.T 写道
真正的IoC容器其实只有一个,叫做BeanFactory,因此上一篇我在实例化我的IoC容器的时候用了beanFactory的引用变量名。

这句其实蛮有问题的,你下面说的ApplicationContext也是IOC的容器,而且是Spring官方比较推荐用的容器,因为扩展了几个接口,可以更方便的获取配置文件,以及消息源。

回CT,其实ApplicationContext和XmlBeanBeanFactory都是实现了BeanFactory的接口,算是它的子类,从根源上来说ApplicationContext也就是BeanFactory
不过我这样用“唯一”来形容确实容易产生误会,我会更正掉,谢谢指正
1 楼 C.T 2011-04-29  
真正的IoC容器其实只有一个,叫做BeanFactory,因此上一篇我在实例化我的IoC容器的时候用了beanFactory的引用变量名。

这句其实蛮有问题的,你下面说的ApplicationContext也是IOC的容器,而且是Spring官方比较推荐用的容器,因为扩展了几个接口,可以更方便的获取配置文件,以及消息源。

相关推荐

Global site tag (gtag.js) - Google Analytics