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