读完spring源码深入后浅出系列之什么是ioc

4 篇文章 0 订阅

读完spring源码深入后浅出系列之什么是ioc


先不想spring是什么东西,想想我们通常怎么用吧。我们用的最多的莫过于调用getBean方法得到一个我们想要实例(一个service或manager)。从这个角度上来讲,spring就是一个装有所有bean的容器,我们想什么时候拿到一个我们想要的实例都是可以的。同时spring为我们做了一件事情,就是管理这些实例之间的互相引用关系,即如类A中有一个类B的属性,那么我们不需要在A中new一个B的对象,我们只需要直接用B就可以了,而给B属性赋值的事情这交给了spring来做。

那么想想如果我们自己实现一个ioc该怎么做?

首先,因为是容器,首先一定要有一个集合存储这些bean相关的信息,即首先要维护一个集合,此时我们可以用HashMap。

其次,要维护这些bean之间的关系。此时我们可以定义一个BeanDefinition类,这个类包括了我们在配置在spring配置文件中bean标签的所有信息,如id、class、property等,就相当于这些类表示了一个bean的所有信息,即这个类是和我们系统定义的bean是一一对应的关系。那么在系统初始化的时候那个HashMap集合就是保存的这个类的实例。

至此,spring的容器以及ioc功能已经实现了。是不是感觉很简单,其实spring本身也是这么实现的,只不过它在实现的过程中考虑了更多很细节或扩展性的东西。

提起中spring中的IoC容器,那就是BeanFactory了,接口BeanFactory按照上面的思路提供了基本的容器的架构。
其实现类我们用的最多的也就是XmlBeanFactory,下面我们简单说一下这个类的实现方式:

第一步要传入一个Resource对象,这个Resource其实就是我们写的xml的配置文件,里面配置的是bean的信息。

第二步XmlBeanFactory有一个XmlBeanDefinitionReader属性,XmlBeanDefinitionReader类负责读取第一步中传入的xml文件信息,之后调用registerBeanDefinition方法进行对得到的BeanDefinition类进行注册,其实就是在Map集合中添加BeanDefinition的信息。这里提一句,此时Map用的是类ConcurrentHashMap,这个实现类兼顾了Hashtable和HashMap两者的优点。

第三步,到第二步系统已经初始化成功,第三步就是在系统中我们调用getBean方法得到我们想要的bean了。此时getBean方法就会根据Map集合中保存的BeanDefinition信息来声明我们需要的类对象,同时给这个类相应的属性进行赋值。(也就是所谓的依赖注入或控制反转IoC)


其实spring的IoC容器中,我们用的最多的还不是BeanFactory,而是接口ApplicationContext。相对于BeanFactory,ApplicationContext则是一个更高级的IoC容器。如果说BeanFactory使spring成为了容器,那么ApplicationContext则使spring成为了框架。因为ApplicationContext除了提供BeanFactory提供的基本的容器的功能外,还扩展了很多企业级应用必不可少的功能,如国际化、系统生命周期的事件等。

Spring另外一个重要的功能就是AOP,spring的AOP其实是在我们编写的类代码的基础上加上一个功能的代码,如事务,使用spring过程中我们的代码是不用管事务的,但其实在编译成字节码的时候spring会在我们的方法里根据我们的事务配置加上事务处理的相关代码,这样就达到了面向切面编程,关于这方面我也会再写一篇文章来介绍。

如果读者对spring源码感兴趣,也可以下载源码到自己的机器上仔细阅读。
下载方法见
http://blog.csdn.net/ma_shijie/archive/2010/12/03/6053351.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值