Spring
2021-04-08 08:47:21 5 举报
登录查看完整内容
Spring扫描时序图
作者其他创作
大纲/内容
获取BeanFactory所有注册的bean信息
通过beanName尝试从缓存获取bean的实例:1、从singletonObjects获取2、从earlySingletonObjects获取3、从singletonFactories获取
遍历beanNames
是否是FactoryBean?
注册Spring内置的后置处理器:1、ConfigurationClassPostProcessor 2、AutowiredAnnotationBeanPostProcessor 3、CommonAnnotationBeanPostProcessor 4、EventListenerMethodProcessor 5、DefaultEventListenerFactory
是否包含@Configuration的类?
执行到该处,证明该bean实例已经是一个完整的实例
是
获取配置类上得@ComponentScan的属性,进行扫描
执行前面的所有的BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法(BeanDefinitionRegistryPostProcessor为BeanFactoryPostProcessor的子类,此处包含用户添加进来的BeanFactoryPostProcessor)
扫描出符合的类,注册到Spring容器
执行MergedBeanDefinitionPostProcessor
处理缓存:1、放进singletonObjects2、从singletonFactories移除3、从this.earlySingletonObjects.remove(beanName);移除
执行ConfigurationClassPostProcessor,该类为BeanDefinitionRegistryPostProcessor的实现类
是否有新的BeanDefinitionRegistryPostProcessor?(有可能之前的BeanDefinitionPostProcessor会向Spring容器添加新的BeanDefinitionRegistryPostProcessor)
执行BeanPostProcessor的postProcessAfterInitialization方法,可进行动态代理
执行用户自定义添加的BeanDefinitionRegistryPostProcessor(非注解方法添加进来的)
执行AwareMethods方法,包括以下三种情况:1、beans实现了BeanNameAware,执行其setBeanName方法2、bean实现BeanClassLoaderAware,执行其setBeanClassLoader方法3、bean实现了BeanFactoryAware,执行其setBeanFactory,即该bean持有Spring容器上下文的引用
扫描完成后,获取Spring容器中的BeanDefinitionRegistryPostProcessor,执行其postProcessBeanDefinitionRegistry方法
开始
属性注入(依赖注入)
处理@Import注解,@Import可以引入以下三种类型的类:1、普通的类2、实现了ImportSelector的类3、实现了ImportBeanDefinitionRegistrar
获取所有的BeanFactoryPostProcessor,排除掉手动添加进来的,即剩下都是通过注解添加的BeanFactoryPostProcessor,执行其postProcessBeanFactory方法
执行所有的BeanFactoryPostProcessor
执行invokeInitMethods
Spring容器实例化bean流程图
使用构造方法实例化bean
调用GenericApplicatonContext的构造方法,实例化DefaultListableBeanFactory
否
放进singletonFactories缓存
结束
执行InstantiationAwareBeanPostProcessor
注册用户自定义的配置类(即加了@Configration或@Component等注解的类)
逐一解析加了@Confiuration的类
beanName= & + beanName
是否获取到?
执行BeanPostProcessor的postProcessBeforeInitialization方法,可进行动态代理
从singletonObjects获取
Spring容器注册bean流程图
循环依赖问题,通过提前暴露出来尚未完成实例化的bean到singletonFactories中解决
从BeanFacotory获取所有的beanNames
执行ConfigurationClassPostProcessor进行扫描
收藏
0 条评论
回复 删除
下一页