spring源码
2024-10-28 14:48:22 0 举报
spring源码
作者其他创作
大纲/内容
构建几个重要的后置处理器
检查规则
注册bean定义
调用父类的无参构造方法
postProcessBeanFactory(beanFactory);
配置完配置类
到这里所有的bean定义都已经注册完毕
初始化上下文消息源
调用后置处理器的postProcessBeanDefinitionRegistry
处理内部类
对象初始化
如果bean有依赖,先创建所需要依赖的bean
单例池取beanName,是否为null?
可以进一步注册bean定义
循环取出配置类
是null
初始化其他特殊bean
将这个bean实例加入到单例池
ConfigurationClassParser#doProcessConfigurationClass
初始化应用的事件多播器
到这一步,所有的需要常规bean定义,都已经准备完毕。
onRefresh();这个一个空方法
1、不是抽象类2、且 单例3、且 不是懒加载
解决循环依赖
解析完所有配置类之后,有可能会引入新的后置处理器
真正实例化
parser.parse(candidates);
是否是factoryBean?
处理带有@Import
创建了一个bean工厂
prepareRefresh()
从多播器中根据事件或者类型获取监听器
这里容器中的所有监听器bean定义都已经加入到多播器中,但是还没有实例化!所以这里只能发布早期事件
原生bean就是还没有完成初始化的bean
这里事件监听工厂 已经初始化完成
注册监听器bean
注册bean
为FULL类型的配置类创建CGLIB代理类
ConfigurableListableBeanFactory#preInstantiateSingletons
到这里:注册了5个内部的bean定义注册了我们配置类的bean定义所有的bean都还没有实例化
AbstractBeanFactory#doGetBean
返回当前单例
是否实现PriorityOrdered接口?
是否有@Configuration注解的bean定义
刷选出配置类,进行解析
是否dependsOn?
是
SimpleApplicationEventMulticaster#doInvokeListener
创建了早期对象
创世纪的:EventListenerMethodProcessor#postProcessBeanFactory
检查是否有InstantiationAwareBeanPostProcessor类型的后置处理器满足相关条件会调用:applyBeanPostProcessorsBeforeInstantiation或者applyBeanPostProcessorsAfterInitialization
finishRefresh();
registerBeanPostProcessors(beanFactory)
context.publishEvent(springEvent)
getBean(dep)
springCloud从这里启动的
属性填充
从这以后再没有早期事件了
真正开始解析
注册了5个内部的后置处理器
此时beanDefinitionMap中将新加入解析配置类得来的beanName
这里的调用涉及到JVM指令InvokeDynamic
除了以上是否还有其他BeanDefinitionRegistryPostProcessor类型的bean
容器BeanPostProcessors加入ImportAwareBeanPostProcessor的后置处理器
注册ImportRegistry为bean定义
注册传入的配置类
!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()
分别实例化beanFactoryPostProcessor的bean
从bean工厂找到以下bean:bean类型为:BeanDefinitionRegistryPostProcessor.class
以下是refresh()
prepareBeanFactory(beanFactory);
针对ConfigurationClassPostProcessor来说是创建代理类。 可能还有其他后置处理器!
可能会有N个beanFactory后置处理器。对bean的属性进行修改
调用后置处理器的postProcessBeanFactory
早期事件:应用程序的事件
初始化bean(后置处理器)
finishBeanFactoryInitialization(beanFactory);
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
initMessageSource()
processConfigBeanDefinitions(registry);
修改bean定义属性只能和bean定义交互,不能和bean交互
通过inCreationCheckExclusionssingletonsCurrentlyInCreation这连个集合来确保单例bean不会被重复创建
注册销毁bean的接口
调用后置处理器的postProcessBeanFactory方法
就是读取器注册的bean定义(除了ConfigurationClassPostProcessor)
将代理类注册为bean定义
自己手动调用容器发布事件
PriorityOrdered,Ordered,剩下
对剩下的后置处理器进行排序
实例化并注册所有的BeanPostProcessors
调用bean工厂的后置处理器
调用多播器的invokeListener方法
invokeBeanFactoryPostProcessors(beanFactory)
AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
registerListeners();
发布早期事件并将早期事件置为null
处理带有@PropertySources
调用postProcessBeanDefinitionRegistry
ConfigurationClassParser#parse
创建bean定义扫描器
实例化前调用后置处理器
否
不为null
实现了SmartInitializingSingleton接口的bean会调用
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
目前只能找到一个:ConfigurationClassPostProcessor
this.reader.loadBeanDefinitions
排除上面的已经处理过的后置处理器
实例化剩余的单例bean
也是创世纪bean:EventListenerFactory
在这里涉及AOP和事务他会解析aop切面信息进行缓存
FULL类型bean:1、有@Configuration注解,且注解属性proxyBeanMethods=trueLite类型bean:不满足FULL类型条件
beforeSingletonCreation(beanName)
将这个值赋给(List)this.eventListenerFactories
进入AbstractAutowireCapableBeanFactory#createBean
取出所有的bean定义
注册内部的bean后置处理器
单例池加锁,保证同时只有一个bean创建
new AnnotationConfigApplicationContext(Myconfig.class);
空方法,预留后期实现
线程池是否为null?
ConfigurationClassPostProcessor#processConfigBeanDefinitions
获取事件监听工厂的bean
满足实例化条件
获取静态指定的监听器,加入到多播器中
创建bean实例化 使用合适的实例化策略来创建新的实例:工厂方法、构造函数自动注入、简单初始化 该方法很复杂也很重要
处理带有@ComponentScan
处理带有@ImportResource
处理接口中的default方法
这里可以实现BeanFactoryPostProcessor接口来对bean的属性进行修改
发布相应事件
注册PriorityOrdered类型
循环解析配置类
这里可以生成代理对象
所有单例bean初始化完成
注册regular 类型
ConfigurationClassParser#processConfigurationClass
注册Ordered类型
给配置类排序依据@Order
调用函数式接口的getObject()方法
this.beanFactory = new DefaultListableBeanFactory();
排除PriorityOrdered;是否有Ordered接口?
这是容器实例化的第一个bean
发布容器启动完毕事件
this.reader.register(componentClasses);
这里通过实现BeanDefinitionRegistryPostProcessor接口可以进一步注册bean定义
判断哪些可以实例化
this.reader = new AnnotatedBeanDefinitionReader(this);
告诉子类刷新内部bean工厂
处理方法上带有@Bean
从容器中找ApplicationListener.class类型的bean并加入到多播器中
listener.onApplicationEvent(event);
initApplicationEventMulticaster()
此时找到创世纪的有两个,还有一个和事件监听有关。这里可能会有以上解析配置引入的后置处理器也有BeanDefinitionRegistryPostProcessor后置处理器执行中引入的新的beanFactory后置处理器
调用afterSingletonsInstantiated
否 退出方法
主要目的就是创建代理类
创建bean实例
this.scanner = new ClassPathBeanDefinitionScanner(this);
检查是否是lite还是full的bean
创建bean定义的读取器
调用多播器的multicastEvent方法发布事件
ConfigurationClassPostProcessor既属于bean定义注册后置处理器也属于bean工厂后置处理器
从bean工厂中找到以下bean定义:bean类型是BeanFactoryPostProcessor.class
准备bean工厂
这块涉及方法句柄支持!!!
把beanName加入“正在创建集合”中
提交给线程池
创建原生bean对象
实例化bean
手动实例化SimpleApplicationEventMulticaster
进行后置处理 @AutoWired @Value的注解的预解析
0 条评论
下一页