核心模块部分截图:
IOC 源码加载过程:
1. new AnnotationConfigApplicationContext():
再看:AnnotationConfigApplicationContext()的无参构造方法:(因为上面有参构造方法调用了 this()):
这些后置处理器最终注册成为一个RootBeanDefinition,点进注册内置的后置处理器方法即可看到,这里不展开。
可以看到该类实现了BeanFactoryPostProcessor,前一篇文章中我也提到BeanFactoryPostProcessor是Spring的扩展点,可以集成第三方框架、扫描配置类,注解等,功能强大。在这个类中,会解析加了@Configuration的配置类,还会解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解。
这里有一个扫描器,上篇文章也提到过了, BeanDefinitionScanner,主要是一个类路径下的bean定义扫描器。里面有个很重要的方法,doScan,传参可以接收包的全路径。
总结上面三个步骤:(调用this()无参构造进行初始化)
1. new Bean工厂;
2. 定义出Bean定义读取器;
3. 定义出bean扫描器;
注册配置类
见上图第一张源码图,在执行完成this()方法之后,就开始注册我们的配置类了。其本质是通过读取器读取配置类,最后注册成为一个Bean定义。该Bean定义会放入beanDefinitionMap中。
IOC容器刷新接口 - refresh()
然后见第一张源码图,就是调用最重要的方法,refresh()方法了。本次主要看下下面两个方法:
invokeBeanFactoryPostProcessors:调用bean工厂的后置处理器
finishBeanFactoryInitialization():
标签:调用,bean,Bean,源码,注册,IOC,加载 From: https://www.cnblogs.com/zhf123/p/16900289.html