接着上次那个后记接着说,我们已经知道了分析了refresh()这个方法中的关于BeanFactoryPostProcessor的执行的代码分析:
因为任何实现了BeanFactoryPostProcessor接口的bean首先要做的事就是先把自己实例化好,所以我们花了很大篇幅讲了getBean这个Spring的核心方法~
我们看的都是invokeBeanFactoryPostProcessors这个方法682行的代码
执行完682行代码后,控制台的打印日记如下:
我们接着分析第684行代码
进入invokeBeanFactoryPostProcessors这个方法
好了,我们BeanFactoryPostProcessor的postProcessBeanFactory的方法终于实现了:
到此为止,关于BeanFactoryPostProcessor的实例化全部结束了,我们开始继续跟踪~
现在还有一个问题就是SpringSimpleMultiBean.java这个bean实现了BeanPostProcessor接口,但是并没有执行该接口的方法,因为此刻还没有注册BeanPostProcessor
接着看refresh()这个方法
464行写出先要对实现BeanPostProcessor接口的bean进行注册,然后在479行实例化其他普通的被spring管理的没有实现BeanFactoryPostProcessor接口的bean时,再运行BeanPostProcessor的方法
其实上个章节我们已经截图说明BeanPostProcessor的具体实现什么时候执行了
对的,也就是说在init-method方法和InitializingBean接口之前之前执行,很好理解,因为上次我们讲过BeanPostProcessor也是可以对bean进行临时修改的,修改之后的bean才是用户自定义的bean也就是我们想要的bean,然后再运行init-method或者afterPropertiesSet方法,才是合理~
当spring容器完全初始化好我们定义的spring-init.xml中的文件时,控制台打印的就是:
所有的接口都打印了
最后我们在看SpringSimpleMultiBeanTest.java这个测试类
此时applicationContext.getBean()去获取的时候,其实bean已经实例化好了,spring默认是单例的,除非你配置该bean为懒加载,才会在这个时候进行实例化~
下一节,我们具体看下spring是如何注入属性值的~