Spring框架核心源代码的分析及其感受-IOC篇-4

从上一篇,我知道了我们想get的 Bean是怎么实例化出来的,也知道了依赖注入实际是发生在BeanWrapperImpl这个类里面的,接下来我们来看看这个类的实现(也就是applyPropertyValues(beanName, mbd, bw, pvs)  方法里面干的事情):

....
if (propValue.getClass().isArray()) 
{
......
}
else if (propValue instanceof List) 
{
............
}
else if (propValue instanceof Map) {
......
}

......
writeMethod.invoke(object, value);

 

前面的源代码直接就可以看到对数组、list、Map注入的实现,这里省略的实现,因为代码太长了,大家直接自己到这个方法中去看,一看就看得明白,关键是最后这句话writeMethod.invoke,看到了吧,这个writeMethod是JDK反射包里面的Method类,而一个属性其实也是一个方法,所以用invoke把具体的值(可能是一个其他bean,也是有beanFactory实例化的,这里就不重述了),直接注入到了目标对象的目标属性上了,而目标属性是BeanDefinition中保存的ref的name值指定的,就是在XML配置文件中Bean节下的property子元素中定义的东西。

 

好了,通过前面好几篇的分析,我们已经知道了对象的创建、依赖注入的实现,其实还差上一步,那就是在AbstractAutowireCapableBeanFactory类中的doCreateBean方法中调用populateBean方法之后(请参考前面的文章),把创建的并注入好依赖对象或值的Bean放到一个Map中了,而这个Map是BeanFactoey的对象级别的全局变量,它用来缓存各种被创建出来的Bean,这个就是为什么BeanFactory被成为容器的原因,实际上这就是一个隐喻,具体实现是非常简单的,另外从上面的分析可以看出,IOC的实现是如此简单,没有用到什么时髦的技术,最多用到了OO的设计思想(模板模式,继承,组合等等)和SAX以及反射而已,这又一次佐证了这样一个观点:学好最基础的东西+设计思想+方法+好的想象力,就能作出好东西!软件其实很不难!但是这只是从spring的源代码分析中得到的结论,其实在你分析多了,用多了,写得多了的时候,你会发现确实是这个道理!

 

下一步,还会有两篇:

1)Spring IOC源码分析总结(包含自动装配)

2)Spring AOP源代码分析-1(AOP第一篇)

你可能感兴趣的:(spring,AOP,框架,bean,IOC)