首先实例化容器,AnnotationConfigApplicationContext进入该构造方法。然后进入this()方法,这里会默认调用其父类的构造方法会实例化DefaultListableBeanFactory,该类的实现了BeanFactory(Bean工厂)和BeanDefinitionRegistryPostProcessor(注册Bean定义的类),接着初始化一个Bean读取器AnnotatedBeanDefinitionReader,该类做了两件事 注册内置BeanPostProcessor和注册相关的BeanDefinition,接着走register()方法,走完这两步只是把后续需要处理的类准备好了,还没有将配置类解析成Bean定义。接下来最重要了,就是走refresh()方法,(里面十三个方法,学习spring就是学习里面的方法),方法之一:invokeBeanFactoryPostProcesses(beanFactory)(调用Bean工厂的后置处理器),该方法调用Bean工厂的后置处理器将带有类似@Configuration注解的类解析成Bean定义。方法之一:registerBeanPostProcessors(beanFactory)(Bean工厂的后置处理器,ApplicationContext会注册很多处理器Bean的后置处理器就是其中之一)方法之一:finishBeanFactoryInitialization(beanFactory)(实例化剩余的单理Bean)循环所有的Bean定义调用getBean方法实例化Bean,进入该方法:里面涉及到一个概念就是FactoryBean,如果一个类实现了该接口那么getBean返回的实例就是getObject方法返回的实例,如果就想返回该类的实例那么在getBean的时候使用&xx就可以了。然后如下图
IOC容器加载过程和Bean的生命周期深度刨析
最新推荐文章于 2022-09-28 15:35:22 发布