SpringIOC源码
2021-11-03 11:45:55 8 举报
SpringIoc容器创建和bean的生命周期
作者其他创作
大纲/内容
refresh(核心方法)
先去记录系统开始时间this.startupDate = System.currentTimeMillis();
通过customizePropertySources加载系统属性和系统的环境变量
从缓存中获取监听事件ListenerRetriever retriever = this.retrieverCache.get(cacheKey)
1、prepareRefresh()
3、配置beanfactoryprepareBeanFactory(beanFactory)
invokeInitMethods
设置ApplicationContext()为活跃状态this.active.set(true);
dogetBean()核心
创建对象DefaultListableBeanFactory
applyBeanPostProcessorsAfterInitialization(后置处理如aop)
获取容器里已经注册的BeanFactoryPostProcessor(即配置文件)
设置beandefinitionReader的环境,加载器以及解析器和初始化验证
解析配置文件中的${}占位符resolveRequiredPlaceholders
解析classpath开头路径的配置文件span style=\"font-size: inherit;\
由于ConfigurableListablebeanFactory实现了beanDefinitionRegister接口,他会通过registryPostProcessor.postProcessBeanDefinitionRegistry(registry)去执行他的扩展方法,然后去beanFactory获取实现了BeanDefinitionRegistryPostProcessor接口的bean定义信息,分别去执行实现了PriorityOrdered、Ordered接口的扩展方法,然后执行没有实现PriorityOrdered和Ordered接口的扩展方法,最后去调用所有注册的bean的postProcessBeanFactory
定制化beanfactorycustomizeBeanFactory()
9、onrefresh()特殊类初始化扩展
xml配置文件
4、postProcessBeanFactory没有具体实现需要客户自定义实现用于扩展,主要是用于修改beandefinition的信息,但是不能修改bean的实例
10、registerListeners()注册监听器
11、bean实例化finishBeanFactoryInitialization(beanFactory);
主要通过配置allowBeanDefinitionOverridingallowCircularReferences这两个属性
子类实现onApplicationEvent方法
通过广播器循环发布事件,根据事件的类型广播到合适的监听器
注解
将监听事件添加到广播器中
从缓存当中获取bean,采用三级缓存主要解决循环依赖问题,他会先从一级缓存中获取如果为空再从二级缓存获取,如果为空再从三级缓存获取,并将获取到的放入二级缓存,并删除他的三级缓存
加载beandefinition
6、registerBeanPostProcessor()注册beanPostProcessor(具体操作和beanFactoryPostProcessor相仿)
去beanfactory中查找是否有ApplicationEventMulticaster bean的名称,如果没有就新建一个SimpleApplicationEventMulticaster并注册到容器当中
8、initApplicationEventMulticaster()(初始化事件多播器)
populateBean填充属性
如果没有就创建bean对象doCreateBean()(核心方法),先去创建beanWrapper(bean的包装类)createBeanInstance()->instantiateBean采用反射的方式创建实例ctor.newInstance(args);
12、finishRefresh
创建beandefinitionReader对象用来将beandefinition加载到beanfactory
5、invokeBeanFactoryPostProcessors()执行已经注册的BeanFactoryPostProcessor
验证必要的系统环境参数通过ConfigurablePropertyResolver#setRequiredProperties可以自定义设置必要的环境变量
applyBeanPostProcessorsBeforeInitialization执行前置处理
invokeAwareMethods先执行aware方法
创建一个标准环境new StandaredEnvironment()
配置监听事件this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();
2、obtainFreshBeanFactory();获取beanfactory
先去关闭之前的beanfactory
7、国际化initMessageSource()
获取监听事件的bean(ApplicationListener)
收藏
0 条评论
下一页