spring学习笔记:Spring IOC容器的通俗认识

来源:互联网 发布:日本出云号航母知乎 编辑:程序博客网 时间:2024/05/16 00:49

前言:可能有些文章在你看来非常专业,深奥。但往往并不适合你消化和吸收的,连起码的入门认识也没有。在深入学习spring时,变感觉非常头疼。无论是网上找的一些spring深度剖析还是书籍上的,都无一例外的让你对于spring的深入学习望而却步。偶尔间遇到通俗且“深入”的文章实为庆幸。非常感谢这样的作者。

转自:http://blog.csdn.net/sunxing007/article/details/4421684

前面说到了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来改写前面的主程序.

[java] view plaincopyprint?
  1. package test;  
  2.   
  3. import model.Book;  
  4.   
  5. import org.springframework.beans.factory.BeanFactory;  
  6. import org.springframework.beans.factory.xml.XmlBeanFactory;  
  7. import org.springframework.core.io.ClassPathResource;  
  8. import org.springframework.core.io.Resource;  
  9.   
  10. public class TestXmlBeanFactory {  
  11.     public static void main(String[] args) {  
  12.         Resource res = new ClassPathResource("bean-test.xml");  
  13.         //Resource res = new FileSystemResource("C://project//spring//src//spring-test.xml");  
  14.         BeanFactory factory = new XmlBeanFactory(res);  
  15.         Book book = (Book)factory.getBean("myBook");  
  16.         System.out.println(book.toString());  
  17.     }  
  18. }  

用法基本和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的配置文件:

[xhtml] view plaincopyprint?
  1. <bean id="myBook" class="model.Book">  
  2.  <property name="id" value="000002" />  
  3.  <property name="name" value="Thinking in java" />  
  4.  <property name="author" value="Bruce Eckel" />  
  5.  <property name="price" value="2222" />  
  6. </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,内容如下:

[java] view plaincopyprint?
  1. log4j.rootLogger=INFO, RC  
  2. log4j.appender.RC=org.apache.log4j.ConsoleAppender  
  3. log4j.appender.RC.threshold=debug  
  4. log4j.appender.RC.layout=org.apache.log4j.PatternLayout  
  5. log4j.appender.RC.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p :%m;%n  
  6. log4j.appender.RC.immediateFlush=true  
  7.   
  8. log4j.logger.org.springframework=DEBUG  

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

 

总结:文章内容很简单,无非是想要引出IOC是通过反射进行实现的。我觉得作者分析的很流畅,感觉像是在读小说。

 

 

原创粉丝点击