Spring容器功能扩展
2020-09-09 11:09:05 0 举报
Spring容器功能扩展主要过程
作者其他创作
大纲/内容
由子类实现该方法,此时因为bean的配置元数据都已经获取了但实例还未初始化,因此可以使用此方法针对不同的子类(应用上下文)注册一些需要的BeanPostProcessors,以改变配置元数据
registerBeanPostProcessors(beanFactory)
beanFactory.preInstantiateSingletons()
getEnvironment().validateRequiredProperties()
可根据自身需要重写,进行个性化属性处理及设置
1、if:1.1、若beanFactory不是BeanDefinitionRegistry实例,直接将硬编码注册的后处理器进行调用;2、else:2.1、将硬编码注册的后处理器分为BeanDefinitionRegistryPostProcessor和\bBeanFactoryPostProcessor两类,并且将BeanDefinitionRegistryPostProcessor执行自定义的方法;2.2、将配置注册的BeanDefinitionRegistryPostProcessor分为PriorityOrdered、Ordered、NonOrdered三类,分别对三类进行排序后调用;2.3、调用硬编码方式的BeanDefinitionRegistryPostProcessor和\bBeanFactoryPostProcessor3、将配置注册的BeanFactoryPostProcessor分为PriorityOrdered、Ordered、NonOrdered三类,分别对三类进行排序后调用;4、beanFactory.clearMetaDataCache().
初始化lifecycleProcessor,如果用户自定义了则使用用户的,未自定义则使用DefaultLifecycleProcessor
初始化Spring的事件广播器,如果用户自定义了,就使用用户自定义的;若用户为定义,使用Spring提供的SimpleApplicationEventMulticaster(beanFactory);广播器的作用是存放监听器并在合适的时候调用监听器。
可被子类重写的方法,可以实现一些指定上下文的相关操作,在单例初始化之前执行
初始化所有的非懒加载bean,包括FactoryBean和普通Bean,初始化之后并对所有SmartInitializingSingleton类型的bean进行初始化回调:smartSingleton.afterSingletonsInstantiated()
AbstractApplicationContext.refresh()
主要功能是提取配置中定义的messageSource(Spring定义的访问国际化信息的接口);如果用户未设置资源文件,Spring提供默认的配置DelegatingMessageSource
此时,Spring已经完成了对配置的解析
DefaultLifecycleProcessor.startBeans(true)
initLifecycleProcessor
initApplicationEventMulticaster()
1、清除上下文级别的资源缓存(例如来自扫描的ASM元数据);2、为上下文初始化lifecycle处理器;3、启动所有实现了 Lifecycle接口的bean;4、发布ContextRefreshedEvent事件;
构造函数中调用
publishEvent(new ContextRefreshedEvent(this))
如果之前没有注册 bean 后处理器(例如 PropertyPlaceholderConfigurer),则注册默认的嵌入值解析器:此时主要用于注释属性值的解析
当完成ApplicationContext初始化时,需要将该事件广播出去
StartBean的过程会对所有的bean进行启动的优先级排序,并且对不同优先级的bean分组,按顺序启动,当然也考虑到了依赖关系,被依赖的bean要先于依赖其的bean启动。
finishRefresh()
仅仅是注册BeanPostProcessors,因为bean实例化阶段才会使用这些后处理器。只包括注册方式的BeanPostProcessors,没有硬编码方式,因为硬编码是直接提取并调用,此处不需要调用
验证是否包含需要的属性,比如在重写initPropertySource()时,设置了requiredProperties,则此处就会验证是否存在
beanFactory.addEmbeddedValueResolver(xxx)
1、将配置注册的BeanPostProcessor分为三类PriorityOrdered、Ordered、NonOrdered,另外,这三类中的BeanPostProcessor如果是MergedBeanDefinitionPostProcessor的实例,则同时也被加入internalPostProcessors变量中;2、对PriorityOrdered、Ordered两类分别进行排序后注册,对NonOrdered直接进行注册;3、对internalPostProcessors中的后处理器进行注册。(注册时会检测是否重复过,会将重复的移除,保证只注册了一次)4、添加ApplicationListener探测器
initMessageSource()
(ConfigurableListableBeanFactory)obtainFreshBeanfactory()
缓存所有 BeanDefinition 元数据,不期望进一步更改
ClassPathXmlApplicationContext
initPropertySource()
invokeBeanFactoryPostProcessors(beanFactory)
beanFactory.freezeConfiguration()
customizeBeanFactory(beanFactory)
postProcessBeanFactory(beanFactory)
顺序执行
prepareRefresh()
finishBeanFactoryInitialization(beanFactory)
prepareBeanFactory(beanFactory)
loadBeanDefinitions(beanFactory)
主要是对系统属性及环境变量的初始化验证
定制beanFactory,设置相关属性,包括是否允许覆盖同名的不同定义的对象及循环依赖
registerListeners()
获取beanfactory,使得ApplicationContext拥有beanFactory的全部能力
初始化ConversionService,目的是可以使用Spring提供的类型转换器(当然自定义转换器也可以,但和Spring提供的无关)
增加对SpEL语言的支持;增加对属性编辑器的支持;增加对内置类的信息注入(如:EnvironmentAware),增加某些bean后置处理器;设置依赖可忽略借口;注册固定的依赖属性;增加对AspectJ的支持;将相关环境变量及属性注册为单例
getLifecycleProcessor().onRefresh()
onRefresh()
初始化某些需要的bean(通过getBean方法),并且初始化非懒加载的bean
refreshBeanFactory()
beanFactory.setConversionService(xxx)
调用BeanFactoryPostProcessors,包括硬编码方式和注册方式,主要是因为除了注册还要激活后处理器
(DefaultListableBeanFactory)createBeanFactory()
注册监听器,分为硬编码方式注册的监听器和配置文件注册的监听器IoC容器创建bean主要有三种方式:硬编码,元数据和配置文件硬编码:直接使用和beanFactory及BeanDefinition等直接注册生成bean;元数据:元数据的方式也即注解方式;配置文件:xml和properties文件,广泛使用xml文件的方式来定义bean。
0 条评论
回复 删除
下一页