spring学习笔记:Spring IOC容器,Spring源码

来源:互联网 发布:骑马与砍杀美女数据 编辑:程序博客网 时间:2024/06/04 17:48

前面说到了spring使用配置文件来描述bean与bean之间的关系,并且由IOC容器来实例化这些bean,刚才的程序使用了ApplicationContext,其实它是建立在BeanFactory之上的, 也就是说BeanFactory是spring ioc容器底层的实现.它提供了ioc容器的基础功能;ApplicationContext在BeanFactory的基础上提供了更丰富的功能, 比如国际化, 框架事件.

在这里插一句,当你听到IOC容器的时候,或许你会觉得很陌生,那是因为你把它想复杂了,IOC容器也是普通的javaBean,是普通的java代码写的,只是它的功能有些特殊,它可以存放其他的对象,而且提供了访问途经(如:context.getBean("bean name");)就像List, map一样. 以后我们会经常使用IOC容器这个词,你完全可以理解为,就是BeanFactory,或者ApplicationContext.
BeanFactory只是一个接口,它最常用的实现类是XmlBeanFactory,现在来看如何用XmlBeanFactory来改写前面的主程序.

用法基本和ApplicationContext一样,只是你会发现BeanFactoryApplicationContext少了很多方法.BeanFactory需要一个Resource来加载配置文件.spring的Resource 表示一个与来源无关的资源, 它有两种典型的实现方式:ClassPathResource 从类路径加载资源, FileSystemResource从文件系统的某位置加载资源.
现在看一下建立在BeanFactory之上的ApplicationContext,它也有不同的实现方式,我们先前用到了ClassPathXmlApplicationContext来实例化一个ApplicationContext, 另外一种典型的方式是FileSystemXmlApplicationContext,它是从文件系统的某位置加载配置文件.因此,前面的ApplicationContext我们可以这样构造:ApplicationContext c = new FileSystemXmlApplicationContext("c://somepath//somefile");
ApplicationContext还有一个很有用的分支WebApplicationContext,是专门为web引用而设计的,这个在后面讨论spring mvc的时候再来讨论它.
现在思考一下:BeanFactory,顾名思义,就是创造Bean的工厂,它是怎么来创造bean的.来看一下一个bean的配置文件:

有类名,有属性名,有属性的value,聪明的你一定想到了, 用反射就可以把这个配置变成一个java 对象.不错,spring正是这样做的.如果你还没有了解反射, 建议你搜索以下,顺便了解一下Class这各类.如果你感兴趣, 也可以自己写一个BeanFactory试试看,其实不难; 如果你想看一看spring源码,你可以这样做:
在Eclipse/MyEclipse下,按住ctrl,在程序代码中鼠标点你想察看的类,如果你还没有给该类附加源代码,回出现如下一样的页面,比如我刚才想察看WebApplicationContext:


点击attach source...,Exteral File..., 文件对话框中选择你的spring下载的解压包的dist/module-sources/spring-web-sources.jar.

这样就把所有的spring web相关的源码加入经来了.不要笑我罗索,我使用eclipse两年之后才会添加源码,因为没有人告诉我.

还可以打log的方式来看看BeanFactory初始化, 实例化,查找Bean的过程,这需要配置log4j. 在spring下载包下面的lib/log4j把该jar包拷贝到WEB-INF/lib,在src目录建一个文件log4j.properties,内容如下:

关于log4j的配置不是本文的讨论范围,不过我还是稍微解释一下, 最上面6行配置了一个根logger,消息会被输出到控制台,这句话log4j.logger.org.springframework=DEBUG的意思是把org.springframework包下面所有的日志输出的级别设为DEBUG(最低级别),这样才可以输出springdebug消息.
再重新运行程序,这时候在控制台你会看到BeanFactory的所有的活动.

原创粉丝点击