springIoc整体流程
2021-10-23 23:36:24 0 举报
AI智能生成
soringioc过程
作者其他创作
大纲/内容
调用父类构造方法 this.beanFactory = new DefaultListableBeanFactory()
注册spring自身需要的bean
初始化注解bean定义扫描器 this.reader = new AnnotatedBeanDefinitionReader(this);
初始化classPatn类型bean定义扫描器 this.scanner = new ClassPathBeanDefinitionScanner(this);
调用构造方法 this()
注册我们的配置类 register(annotatedClasses);
准备刷新上下文环境:prepareRefresh();
获取告诉子类初始化Bean工厂:ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()
注册了一个完整的ApplicationContextAwareProcessor 后置处理器用来处理ApplicationContextAware接口的回调方法beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
对bean工厂进行填充属性:prepareBeanFactory(beanFactory);
留个子类去实现该接口:postProcessBeanFactory(beanFactory);
先初始化internalConfigurationAnnotationProcessor调用postProcessBeanDefinitionRegistry方法向容器中注入其他bean定义
调用 the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
调用 the BeanDefinitionRegistryPostProcessors that implement Ordered
注意通过上面这几部调用,容器中所有BeanDefinitionRegistryPostProcessor后置处理器全部调用完成,所有的bean定义全部注册到容器当中
由于BeanDefinitionRegistryPostProcessor也是BeanFactoryPostProcessors实现,在这里调用BeanFactoryPostProcessors实现方法
先BeanDefinitionRegistryPostProcessor的后置处理器
先调用BeanFactoryPostProcessor实现了 PriorityOrdered接口的
再调用BeanFactoryPostProcessor实现了 Ordered.
调用没有实现任何方法接口的
通过上面几步调用,所有的BeanFactoryPostProcessor调用完成
调用我们的bean工厂的后置处理器.:invokeBeanFactoryPostProcessors(beanFactory)
调用我们bean的后置处理器:registerBeanPostProcessors(beanFactory)
初始化国际化资源处理器:initMessageSource()
创建事件多播器:initApplicationEventMulticaster()
留个子类实现的springboot也是从这个方法进行启动tomat的:onRefresh()
把我们的事件监听器注册到多播器上:registerListeners();
冻结所有的 bean 定义 ,注册的 bean 定义到这里不在允许修改beanFactory.freezeConfiguration()
先从缓存中拿
循环容器所有的InstantiationAwareBeanPostProcessor执行前置调用方法
如果上一步生成的代理对象不为null ,那么循环容器所有的InstantiationAwareBeanPostProcessor执行后置调用方法
我们可以实现InstantiationAwareBeanPostProcessor接口阻止对象创建或者返回我们自己创建的对象
遍历循环InstantiationAwareBeanPostProcessor执行postProcessAfterInstantiation
遍历循环InstantiationAwareBeanPostProcessor执行postProcessPropertyValues
如果bean实现了BeanNameAware 调用setBeanName方法
如果bean实现了BeanClassLoaderAware调用setBeanClassLoader方法
如果bean实现了BeanFactoryAware调用setBeanFactory方法
获取我们容器中的所有的bean的后置处理器/挨个调用我们的bean的后置处理器的postProcessBeforeInitialization
在这里判断回调了Awer接口的各种方法invokeAwareInterfaces(Object bean)
由于上一步是循环调用,容器中已经有ApplicationContextAwareProcessor(准备容器的时候spring放进去的)所以会执行它的postProcessBeforeInitialization方法
如果bean实现了InitializingBean接口,回调afterPropertiesSet方法
调用我们自己的初始化init方法
获取我们容器中的所有的bean的后置处理器/挨个调用我们的bean的后置处理器的applyBeanPostProcessorsAfterInitialization
实例化完成放到单例缓存池中
doGetBean方法
循环所有的bean定义,依次调用getBean(beanName)
此时所有的bean已经到单例缓存池中,这时循环所有的bean对象 ,如果当前bean实现SmartInitializingSingleton接口,调用afterSingletonsInstantiated方法,这个也是spring留给我们的扩展点
到这里所有bean对象全部完成
实例化所有的实例bean beanFactory.preInstantiateSingletons()
实例化我们剩余的单实例bean:finishBeanFactoryInitialization(beanFactory)
最后容器刷新 发布刷新事件 finishRefresh();
Ioc容器刷新接口 refresh();
springIoc整体流程
收藏
收藏
0 条评论
下一页