写点什么

Day168

  • 2022 年 5 月 08 日
  • 本文字数:3161 字

    阅读完需:约 10 分钟

// 刷新前的预准备工作


prepareRefresh();


// 提取 bean 的配置信息并封装成 BeanDefinition 实例,然后将其添加到注册中心。注册中心是一个 ConcurrentHashMap<String,BeanDefinition>类型,key 为 Bean 的名字,value 为 BeanDefinition 实例。


ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();


//对 beanFactory 进行一些配置,注册一些 BeanPostProcessor 和一些特殊的 Bean。


prepareBeanFactory(beanFactory);


//留给子类在 BeanFactory 准备工作完成后处理一些工作。


postProcessBeanFactory(beanFactory);


//调用 BeanFactory 的后置处理器。


invokeBeanFactoryPostProcessors(beanFactory);


//注册 Bean 的后置处理器。


registerBeanPostProcessors(beanFactory);


//国际化相关功能


initMessageSource();


//初始化事件派发器;


initApplicationEventMulticaster();


// 提供给子容器类,供子容器去实例化其他的特殊的 Bean


onRefresh();


// 处理容器中已有的 ApplicationListener


registerListeners();


//初始化容器中剩余的单实例 bean


finishBeanFactoryInitialization(beanFactory);


//最后一步


finishRefresh();


}


}


[](()一、BeanFactory 预准备




Spring 容器的 refresh()【创建刷新】;


1、prepareRefresh();刷新前的预处理


1)、initPropertySources();初始化一些属性设置;子类自定义个性化属性设置方法


2)、getEnvironment().validateRequiredProperties();检验属性的合法性


3)、this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期事件


2、obtainFreshBeanFactory();获取 BeanFactory


1)、refreshBeanFactory();刷新【创建】BeanFactory


创建了一个 this.beanFactory = new DefaultListableBeanFactory();


设置 id


2)、getBeanFactory();返回刚才 GenericApplicationContext 创建的 BeanFactory 对象


3)、将创建的 BeanFactory【DefaultListableBeanFactory】返回;


3、prepareBeanFactory(beanFactory);BeanFactory 预准备工作(BeanFactory 进行一些设置)


1)、设置 BeanFactory 的类加载器、支持表达式解析器...等


2)、添加部分 BeanPostProcessor【ApplicationContextAwareProcessor】


3)、设置忽略的自动装配的接口 EnvironmentAware、EmbeddedValueResolverAware....等


4)、注册可以解析的自动装配;我们能直接在任何组件中自动注入:


BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext


5)、添加 BeanPostProcessor【ApplicationListenerDetector】


6)、添加编译时的 AspectJ 支持:


7)、给 BeanFactory 中注册一些能用的组件:


environment【ConfigurableEnvironment】、


systemProperties【Map<String, Object>】、


systemEnvironment【Map<String, Object>】


4、postProcessBeanFactory(beanFactory);BeanFactory 准备工作完成后进行的后置处理工作;


1)、子类通过重写这个方法来在 BeanFactory 创建并预准备完成以后做进一步设置


[](()二、执行 BeanFactoryPostProcessor




5、invokeBeanFactoryPostProcessors(beanFactory);执行 BeanFactoryPostProcessor 的方法;


BeanFactoryPostProcessor:BeanFactory 的后置处理器。在 BeanFactory 标准初始化【前面的预准备过程】之后执行的


两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor


1)、执行 BeanFactoryPostPro 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 cessor 方法;


先执行 BeanDefinitionRegistryPostProcessor


1、获取所有 BeanDefinitionRegistryPostProcessor;


2、看先执行实现了 PriorityOrdered 优先级接口的获取所有 BeanDefinitionRegistryPostProcessor


postProcessor.postProcessBeanDefinitionRegistry(registry);


3、再执行实现了 Ordered 顺序接口的 BeanDefinitionRegistryPostProcessor


postProcessor.postProcessBeanDefinitionRegistry(registry);


4、最后执行没有实现任何优先级或者顺序接口的 BeanDefinitionRegistryPostProcessor


postProcessor.postProcessBeanDefinitionRegistry(registry);


再执行 BeanFactoryPostProcessor 的方法


1、获取所有 BeanFactoryPostProcessor;


2、看先执行实现了 PriorityOrdered 优先级接口的获取所有 BeanFactoryPostProcessor


postProcessor.postProcessBeanFactory(beanFactory);


3、再执行实现了 Ordered 顺序接口的 BeanFactoryPostProcessor


postProcessor.postProcessBeanFactory(beanFactory);


4、最后执行没有实现任何优先级或者顺序接口的 BeanFactoryPostProcessor


postProcessor.postProcessBeanFactory(beanFactory);


[](()三、注册 BeanPostProcessor




6、registerBeanPostProcessors(beanFactory);注册 BeanPostProcessor(Bean 的后置处理器)【intercept bean creation,拦截 bean 创建过程】


不同接口类型的 BeanPostProcessor,在 Bean 创建前后的执行时机是不一样的


BeanPostProcessor、


DestructionAwareBeanPostProcessor、


InstantiationAwareBeanPostProcessor、


SmartInstantiationAwareBeanPostProcessor、


MergedBeanDefinitionPostProcessor【internalPostProcessors】


1)、获取所有的 BeanPostProcessor;后置处理器都默认可以通过 PriorityOrdered、Ordered 接口指定优先级


2)、先注册 PriorityOrdered 优先级接口的 BeanPostProcessor


把每个 BeanPostProcessor;添加到 BeanFactory 中


beanFactory.addBeanPostProcessor(postProcessor);


3)、再注册 Ordered 接口的


4)、最后注册没有实现任何优先级接口的


5)、最终注册 MergedBeanDefinitionPostProcessor【internalPostProcessors】


6)、注册一个 ApplicationListenerDetector;来在 bean 创建完成后检查是否是 ApplicationListener,


如果是,applicationContext.addApplicationListener((ApplicationListener<?>) bean);添加到容器中


[](()四、初始化 MessageSource




7、initMessageSource();初始化 MessageSource 组件(做国际化功能,消息绑定,消息解析)


1)、获取 BeanFactory


2)、看容器中是否有 id 为 messageSource 的组件,类型为 MessageSource 的组件


如果有,赋值给 messageSource


如果没有,自己创建一个 DelegatingMessageSource;


MessageSource:取出国际化配置文件中的某个 key 的值;能按照区域信息获取;


3)、把创建好的 MessageSource 注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入 MessageSource;


beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);


自动注入获取后,调用 getMessage();


MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale);


[](()五、初始化事件派发器、监听器等




8、initApplicationEventMulticaster();初始化事件派发器


1)获取 BeanFactory;getBeanFactory();


2)、从 BeanFactory 中获取 applicationEventMulticaster 的 ApplicationEventMulticaster


3)、如果上一步没有自己配置事件派发器;它就创建一个 SimpleApplicationEventMulticaster


4)、将创建的 ApplicationEventMulticaster 添加到 BeanFactory 中,以后其他组件直接自动注入


9、onRefresh();留给子容器(子类)


1)、子类重写这个方法,在容器刷新的时候可以自定义逻辑;


10、registerListeners();给容器中将所有项目里面的 ApplicationListener 注册进来;


1)、从容器中拿到所有的 ApplicationListener 组件


2)、将每个监听器添加到事件派发器中;


getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);


3)、派发之前步骤产生的事件


[](()六、创建 Bean 准备 &Bean 创建完成




11、finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例 bean


1)、beanFactory.preInstantiateSingletons();初始化剩下的单实例 bean


1、获取容器中的所有 bean,依次进行初始化和创建对象

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Day168_Java_爱好编程进阶_InfoQ写作社区