从源代码解读spring IOC容器
spring IOC容器(Inversion of Control container)做项目的时候经常要用到,但是好像感觉不到它的存在,因为代码里面很少用到spring,主要是写配置。但是我不得不说:spring做的确实很巧妙,这种和代码的松耦合很大的提高了代码的灵活性和可扩展性。最近手头的开发任务比较少,于是抽空看了看spring1.2.9的源代码,现在把心得贴出来和网友共享,欢迎大家批评指正。
1. spring IOC容器接口定义
org.springframework.beans.factory 这里是定义spring IOC容器接口的包,在这个包里有我们熟悉的BeanFactory
其实create bean的过程就是通过bean的定义信息反射bean实例的过程。真正用反射造对象的代码这里没有体现出来,我们注意到了BeanWrapper仅仅是bean实例的包装类,不涉及到造对象的代码;instantiateUsingFactoryMethod()、autowireConstructor()和instantiateBean()方法里都用到了实例化策略类里面的方法--instantiate(),毫无疑问反射对象的代码就应该在instantiate()里面,现在就让我们来揭开实例化策略类的神秘面纱。
现在总结下:
spring的IOC容器的功能就是把实例化对象和代码解耦,现在造对象的活完全交给spring IOC容器来做了,如果有需要,spring容器还可以把bean注入到依赖它的其它bean中,方便程序使用。我们要做的仅仅是配置好bean定义文件,并告诉spring定义文件在哪,然后在代码里getBean()就行啦!
IOC容器的载体说白了就是Map,即我们常说的缓存。在spring中IOC缓存主要分bean实例的缓存(单例)和bean定义信息的缓存
spring通过定位资源-->解析bean定义文件并缓存bean定义信息-->根据bean定义造bean实例-->如果是单例模式则把这个bean放进缓存管理,否则直接造对象-->如果有依赖关系,则反射目标bean的方法(setter方法/构造方法/普通方法)并将其依赖的bean做为参数传入,完成注入-->至此,IOC容器就建立起来了。 1 楼 stephen_chenxifei 2008-09-19 讲的不错,有时候看看源代码确实能学习到不少的东西 2 楼 jgpycj 2008-09-19 非常感谢,讲的非常详细。对spring的IOC又有了新的认识。 3 楼 ak_2005 2008-09-21 不错,学习学习 !