0
点赞
收藏
分享

微信扫一扫

IOC加载过程

乌龙茶3297 2022-03-22 阅读 99
spring

一、prepareRefresh();
二、obtainFreshBeanFactory();
//刷新bean工厂 refreshBeanFactory();
1、判断是否存在bean工厂,如果存在,就销毁,关闭bean工厂
2、然后进行创建bean工厂createBeanFactory(),返回 DefaultListableBeanFactory 这个类,这个类继承了AbstractAutowireCapableBeanFactory(抽象 Autowire 能力 Bean 工厂),实现了ConfigurableListableBeanFactory(可配置的可列表 Bean 工厂),
BeanDefinitionRegistry(Bean 定义注册表),Serializable(可序列化);
3、然后对创建好的bean工厂进行设置设置序列化 ID;
4、customizeBeanFactory(beanFactory) 设置bean工厂属性:
- allowBeanDefinitionOverriding:是否允许覆盖同名称的不同定义的对象。
- allowCircularReferences:是否允许bean之间的循环依赖。
5、loadBeanDefinitions(beanFactory) 加载 Bean 定义
可以对配置文件进行加载(XML、注解、Java类)
为给定的 BeanFactory 创建一个新的 XmlBeanDefinitionReader。然后设置环境,设置设置资源加载器,设置设置实体解析器
然后初始化 Bean 定义阅读器: initBeanDefinitionReader(beanDefinitionReader);
然后进行获取资源数据,有两种方式获取:
从配置的资源获取,返回一个Resource[],资源数组
从配置中获取要解析的配置文件地址,返回一个String[],字符数组
然后读取配置文件返回读取的个数,拿到每一个配置文件,加载进来,获取inputStream,然后doLoadBeanDefinitions(真正执行的方法 以do开头),然后封装成Document来进行解析(这个是解析XML配置文件的方式),然后注册 Bean 定义,开始解析节点,拿到 Document 中的根节点,遍历根节点和所有子节点。
三、prepareBeanFactory()主要是对beanFactory进行各种填充
- beanFactory.setBeanClassLoader:设置类加载器,在则直接设置/不存在则新建一个默认类加载器
- beanFactory.setBeanExpressionResolver:设置EL表达式解析器(Bean初始化完成后填充属性时会用到)
- beanFactory.addPropertyEditorRegistrar:添加属性编辑器注册器,beanFactory增加一个默认的propertyEditor,这个主要是对 bean属性设置的一些管理工具
- beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));添加bean 的后处理器,将当前的ApplicationContext对象交给ApplicationContextAwareProcessor类来处理,从而在Aware接口实现类中的注入applicationContext
- //设置忽略自动装配的接口
- //注册可以解析的自动装配
- //如果当前BeanFactory包含loadTimeWeaver Bean,说明存在类加载期织入AspectJ,则把当前BeanFactory交给类加载期BeanPostProcessor实现类LoadTimeWeaverAwareProcessor来处理,从而实现类加载期织入AspectJ的目的。
以下就是一些系统配置和系统环境信息,如果发现没有这些bean则spring自己注册
- //注册当前容器环境environment组件Bean
- //注册系统配置systemProperties组件Bean
- /注册系统环境systemEnvironment组件Bean
四、postProcessBeanFactory():bean工厂后置处理器,可以对容器实例化任何bean之前读取bean的定义(配置元数据),并可以修改它https://www.cnblogs.com/sishang/p/6588542.html
五、invokeBeanFactoryPostProcessors() :https://www.cnblogs.com/toby-xu/p/11332666.html
通过调用Bean工厂后置处理器
六、registerBeanPostProcessors(beanFactory) registerBeanPostProcessors 方法主要用于处理 BeanPostProcessor 接口 https://www.jianshu.com/p/18fa85935180
七、initMessageSource():国际化处理 https://www.jianshu.com/p/b6dad0c1bc20
八、initApplicationEventMulticaster():为此上下文初始化事件多播器 Set<ApplicationListener<?>> applicationListeners = new LinkedHashSet<>()
九、onRefresh();注册监听器:代码是空的
十、registerListeners() 检查侦听器 bean 并注册它们https://my.oschina.net/u/5582993/blog/5476378
十一、finishBeanFactoryInitialization(beanFactory):实例化所有剩余的(非惰性初始化)单例。https://www.cnblogs.com/yangxiaohui227/p/13438849.html

举报

相关推荐

0 条评论