做一个合格的程序猿之浅析Spring IoC源码(十一)Spring refresh()方法解析后记2

接着上次那个后记接着说,我们已经知道了分析了refresh()这个方法中的关于BeanFactoryPostProcessor的执行的代码分析:


因为任何实现了BeanFactoryPostProcessor接口的bean首先要做的事就是先把自己实例化好,所以我们花了很大篇幅讲了getBean这个Spring的核心方法~


我们看的都是invokeBeanFactoryPostProcessors这个方法682行的代码

执行完682行代码后,控制台的打印日记如下:

做一个合格的程序猿之浅析Spring IoC源码(十一)Spring refresh()方法解析后记2_第1张图片


我们接着分析第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是如何注入属性值的~










你可能感兴趣的:(refresh)