大家好,refresh是什么意思相信很多的网友都不是很明白,包括refresh的12个步骤也是一样,不过没有关系,接下来就来为大家分享关于refresh是什么意思和refresh的12个步骤的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
refresh是AbstractApplicationContext中的一个方法,负责初始化ApplicationContext容器,容器必须调用refresh才能正常工作。它的内部主要会调用12个方法,我们把它们称为refresh的12个步骤:
5.invokeBeanFactoryPostProcessors
8.initApplicationEventMulticaster
11.finishBeanFactoryInitialization
7891012为准备ApplicationContext
11为初始化BeanFactory中非延迟单例bean
*这一步创建和准备了Environment对象,它作为ApplicationContext的一个成员变量
*Environment对象的作用之一是为后续@Value,值注入时提供键值
*systemProperties-保存java环境键值
*systemEnvironment-保存系统环境键值
*自定义PropertySource-保存自定义键值,例如来自于*.properties文件的键值
*这一步获取(或创建)BeanFactory,它也是作为ApplicationContext的一个成员变量
*BeanFactory的作用是负责bean的创建、依赖注入和初始化,bean的各项特征由BeanDefinition定义
*BeanDefinition作为bean的设计蓝图,规定了bean的特征,如单例多例、依赖关系、初始销毁方法等
*BeanDefinition的来源有多种多样,可以是通过xml获得、配置类获得、组件扫描获得,也可以是编程添加
*所有的BeanDefinition会存入BeanFactory中的beanDefinitionMap集合
*这一步会进一步完善BeanFactory,为它的各项成员变量赋值
*beanExpressionResolver用来解析SpEL,常见实现为StandardBeanExpressionResolver
*propertyEditorRegistrars会注册类型转换器
*它在这里使用了ResourceEditorRegistrar实现类
*并应用ApplicationContext提供的Environment完成${}解析
*registerResolvableDependency来注册beanFactory以及ApplicationContext,让它们也能用于依赖注入
*beanPostProcessors是bean后处理器集合,会工作在bean的生命周期各个阶段,此处会添加两个:
*ApplicationContextAwareProcessor用来解析Aware接口
*ApplicationListenerDetector用来识别容器中ApplicationListener类型的bean
*这一步是空实现,留给子类扩展。
*一般Web环境的ApplicationContext都要利用它注册新的Scope,完善Web下的BeanFactory
*这一步会调用beanFactory后处理器
*beanFactory后处理器,充当beanFactory的扩展点,可以用来补充或修改BeanDefinition
*ConfigurationClassPostProcessor–解析@Configuration、@Bean、@Import、@PropertySource等
*PropertySourcesPlaceHolderConfigurer–替换BeanDefinition中的${}
*MapperScannerConfigurer–补充Mapper接口对应的BeanDefinition
*这一步是继续从beanFactory中找出bean后处理器,添加至beanPostProcessors集合中
*bean后处理器,充当bean的扩展点,可以工作在bean的实例化、依赖注入、初始化阶段,常见的有:
*AutowiredAnnotationBeanPostProcessor功能有:解析@Autowired,@Value注解
*CommonAnnotationBeanPostProcessor功能有:解析@Resource,@PostConstruct,@PreDestroy
*AnnotationAwareAspectJAutoProxyCreator功能有:为符合切点的目标bean自动创建代理
*这一步是为ApplicationContext添加messageSource成员,实现国际化功能
*去beanFactory内找名为messageSource的bean,如果没有,则提供空的MessageSource实现
*这一步为ApplicationContext添加事件广播器成员,即applicationContextEventMulticaster
*去beanFactory找名为applicationEventMulticaster的bean作为事件广播器,若没有,会创建默认的事件广播器
*之后就可以调用ApplicationContext.publishEvent(事件对象)来发布事件
*SpringBoot中的子类在这里准备了WebServer,即内嵌web容器
*这一步会从多种途径找到事件监听器,并添加至applicationEventMulticaster
*事件监听器顾名思义,用来接收事件广播器发布的事件,有如下来源
*要实现事件监听器,只需要实现ApplicationListener接口,重写其中onApplicationEvent(Ee)方法即可
*这一步会将beanFactory的成员补充完毕,并初始化所有非延迟单例bean
*conversionService也是一套转换机制,作为对PropertyEditor的补充
*embeddedValueResolvers即内嵌值解析器,用来解析@Value中的${},借用的是Environment的功能
*singletonObjects即单例池,缓存所有单例对象
*对象的创建都分三个阶段,每一阶段都有不同的bean后处理器参与进来,扩展功能
*这一步会为ApplicationContext添加lifecycleProcessor成员,用来控制容器内需要生命周期管理的bean
*如果容器中有名称为lifecycleProcessor的bean就用它,否则创建默认的生命周期管理器
*准备好生命周期管理器,就可以实现
*调用context的start,即可触发所有实现LifeCycle接口bean的start
*调用context的stop,即可触发所有实现LifeCycle接口bean的stop
*发布ContextRefreshed事件,整个refresh执行完成
关于refresh是什么意思和refresh的12个步骤的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。