Spring源码中,我们不可能指望在一个函数中完成一个复杂的逻辑,而且我们跟踪了那么多Spring代码,经历了那么多函数,或多或少也发现了一些规律:一个真正干活的函数其实是以do开头的,比如doGetObjectFromFactoryBean;而给我们错觉的函数,比如getObjectFromFactoryBean,其实只是从全局角度去做一些统筹的工作。而这个规则对于createBean也不例外,那么让我们看看createBean函数中做了哪些准备工作。
在上述代码中有一个方法:mbd.prepareMethodOverrides();
其实在Spring中确实没有override-method这样的配置,但是我们前面说过,在Spring配置中是存在lookup-method和replace-method的,而这个两个配置的加载其实就是将配置统一存放在BeanDefinition中的methodOverrides属性里,而这个函数的操作其实也就是针对于这两个配置的。我们先看看Override属性标记及验证的逻辑实现。
之前反复提起过,在Sprin配置中存在lookup-method和replace-method两个配置功能,而这两个配置的加载其实就是将配置统一放在BeanDefinition中的methodOverrides属性里,这两个功能实现原理其实是在bean实例化的时候如果检测到存在methodOverrides属性,会动态地位当前bean生成代理并使用对应的拦截器为bean做增强处理,相关的逻辑实现在bean的实例化部分详细介绍。
这里要提到的是,对于方法的匹配来讲,如果一个类中存在若干个重载方法,那么在函数调用及增强的时候还需要 根据参数类型进行匹配,来最终确认当前调用的到底是哪个函数。但是Spring将一部分匹配工作在这里完成了,如果当前类中的方法只有一个,俺么就设置重载该方法没有被重载,这样在后续调用的时候便可以直接使用找到的方法,而不需要进行方法的参数匹配验证了,而且还可以提前对方法存在性进行验证,正可谓一举两得
实例化的前置处理:
在此方法中最吸引我们的方法有两个,在上面用红色圈出。这两个方法的实现其实非常简单,无非是对后处理器中的所有InstantiationAwareBeanPostProcessor类型的后处理器进行postProcessBeforeInstantiation方法和BeanPostProcessor的postProcessAfterInitialization进行调用。
关于这两个方法的详细功能,我们会在后续的文章中介绍,在此只需要知道,它们一个是实例化前的后处理器应用,一个是实例化后的后处理器应用就可以了。