spring源码
2024-10-28 14:35:56 0 举报
AI智能生成
spring源码
作者其他创作
大纲/内容
Spring核心 IOC实现
启动流程
创建beanFactory对象
创建bean定义读取器并注册内置的beanDefinition
this.reader = new AnnotatedBeanDefinitionReader(this);
用来解决@Conditional注解的
this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
注册注解配置的bean定义
注册ConfigurationClassPostProcessor类型的BeanDefinition
设置beanFactory的OrderComparator为AnnotationAwareOrderComparator
设置beanFactory的bean能否进行依赖注入的判断器
注册ConfigurationClassPostProcessor类型的BeanDefinition
注册AutowiredAnnotationBeanPostProcessor类型的BeanDefinition
注册CommonAnnotationBeanPostProcessor类型的BeanDefinition
注册PersistenceAnnotationBeanPostProcessor类型的BeanDefinition
注册EventListenerMethodProcessor类型的BeanDefinition,用来处理@EventListener注解的
注册DefaultEventListenerFactory类型的BeanDefinition,用来处理@EventListener注解的
创建bean定义扫描器
注册@Component对应的AnnotationTypeFilter
注册配置类
将配置类注册成AnnotatedGenericBeanDefinition类型的BeanDefinition
判断@Conditional注解,是否要生成bean
设置配置类的生成bean的代理方法
解析@Scope注解的结果为ScopeMetadata
处理@Lazy、@Primary、@DependsOn、@Role、@Description
处理@scope
注册配置类为一个bean定义
容器刷新
刷新前准备工作
prepareRefresh()
设置启动开始时间
设置容器关闭标识为false
设置容器激活标识为true
储存早期事件监听器
准备beanFactory
设置BeanFactory的类加载器、SpringEL表达式解析器、类型转化注册器
添加三个BeanPostProcessor
ApplicationContextAwareProcessor
用来处理EnvironmentAware、EmbeddedValueResolverAware等回调
ApplicationListenerDetector
负责把ApplicantsListener类型的Bean注册到ApplicationContext中
LoadTimeWeaverAwareProcessor
注册了四个单例Bean
environment
systemProperties
systemEnvironment
applicationStartup
记录ignoreDependencyInterface
记录ResolvableDependency
子类设置beanFactory
调用bean工厂的后置处理器(扫描bean)
执行手动添加的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
执行扫描出来的BeanDefinitionRegistryPostProcessor(实现了PriorityOrdered)的postProcessBeanDefinitionRegistry()方法
只有ConfigurationClassPostProcessor这一个用来解析配置类
这里会执行ConfigurationClassPostProcessor进行@Component的扫描,扫描得到BeanDefinition,并注册到beanFactory中 注意:扫描的过程中可能又会扫描出其他的BeanFactoryPostProcessor,那么这些BeanFactoryPostProcessor也得在这一步执行
执行扫描出来的BeanDefinitionRegistryPostProcessor(实现了Ordered)的postProcessBeanDefinitionRegistry()方法
执行扫描出来的BeanDefinitionRegistryPostProcessor(普通) 的postProcessBeanDefinitionRegistry()方法
执行扫描出来的BeanDefinitionRegistryPostProcessor(所有)的postProcessBeanFactory()方法
执行手动添加的BeanFactoryPostProcessor 的postProcessBeanFactory()方法
执行扫描出来的BeanFactoryPostProcessor(实现了PriorityOrdered)的postProcessBeanFactory()方法
执行扫描出来的BeanFactoryPostProcessor(实现了Ordered)的postProcessBeanFactory()方法
执行扫描出来的BeanFactoryPostProcessor(普通) 的postProcessBeanFactory()方法
执行扫描出来的BeanFactoryPostProcessor(实现了PriorityOrdered)的postProcessBeanFactory()方法
执行扫描出来的BeanFactoryPostProcessor(实现了Ordered)的postProcessBeanFactory()方法
执行扫描出来的BeanFactoryPostProcessor(普通) 的postProcessBeanFactory()方法
扩展点:BeanDefinitionRegistryPostProcessor
引入方式
使用@Configuration+ @Bean 方式初始化
使用@ComponentScan+ @Component方式初始化
两个方法及其作用
postProcessBeanDefinitionRegistry():注册bean
postProcessBeanFactory():修改bean
案例
mybatis-spring就是通过此扩展向spring容器中加入我们mapper的实现类的
Feign 远程调用实现
注册bean的后置处理器
将扫描到的BeanPostProcessors实例化并排序,并添加到BeanFactory的beanPostProcessors属性中去
设置ApplicationContext的MessageSource
设置ApplicationContext的MessageSource,要么是用户设置的,要么是DelegatingMessageSource
设置容器的多播器
设置ApplicationContext的applicationEventMulticaster,要么是用户设置的,要么是SimpleApplicationEventMulticaster
给子类的模板方法
给子类的模板方法,SpringBoot会在这里调用的onRefresh()方法来设置嵌入式tomcat
注册监听器
把定义的ApplicationListener的Bean对象,设置到ApplicationContext中去,并执行在此之前所发布的事件
完成bean工厂的初始化
如果BeanFactory中存在名字叫conversionService的Bean,则设置为BeanFactory的conversionService属性
ConversionService是用来进行类型转化的
设置默认的占位符解析器 ${xxx} ---key
创建LoadTimeWeaverAware类型的Bean
实例化非懒加载的单例Bean
遍历所有的BeanDefinition,对每个BeanDefinition做如下操作
获取合并后的BeanDefinition
可以创建Bean的条件:1、不是抽象类 2、是单例 3、不是懒加载
处理factoryBean
获取FactoryBean对象
创建真正的Bean对象(getObject()返回的对象)
创建其他单例bean
如果beanName是&xxx类型,则调用getObject()返回对象
尝试从父容器创建Bean
创建@DependsOn所依赖的bean对象
实例化前
调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
如果BeanDefinition设置了factoryMethod,那么就是该方法的返回类型,否则就是beanClass属性所表示的类型
实例化
创建Bean实例
BeanDefinition中添加了Supplier,则调用Supplier来得到对象
如果BeanDefinition之前确定了构造方法,构造方法无参数就直接实例化,有参则进行构造方法注入
如果BeanDefinition没有确定构造方法,则推断构造方法
调用SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors()方法来推断构造方法,默认实现是AutowiredAnnotationBeanPostProcessor
如果推断出来了构造方法,则需要给构造方法赋值,也就是给构造方法参数赋值,也就是构造方法注入
如果没有推断出来构造方法,但是autowiremode为AUTOWIRE_CONSTRUCTOR,则也可能需要给构造方法赋值,因为不确定是用无参的还是有参的构造方法
如果通过BeanDefinition指定了构造方法参数值,那肯定就是要进行构造方法注入了
如果调用getBean的时候传入了构造方法参数值,那肯定就是要进行构造方法注入了
以上都不匹配,则直接使用无参构造方法直接实例化
如果存在@Lookup,则会生成一个代理对象(CGLIB)
后置处理合并后的BeanDefinition
调用MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()
解决循环依赖
添加到三级缓存(提前缓存单例创建工厂)
调用SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference()
判断是否返回代理对象
实例化之后,属性填充之前
调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
属性填充
依赖注入
调用InstantiationAwareBeanPostProcessor.postProcessProperties()方法
执行Aware
BeanNameAware:回传beanName给bean对象
BeanClassLoaderAware:回传classLoader给bean对象
BeanFactoryAware:回传beanFactory给对象
初始化
初始化前
调用BeanPostProcessor.postProcessBeforeInitialization()
InitDestroyAnnotationBeanPostProcessor会在初始化前这个步骤中执行@PostConstruct的 方法
ApplicationContextAwareProcessor会在初始化前这个步骤中进行其他Aware的回调:
i. EnvironmentAware:回传环境变量
ii. EmbeddedValueResolverAware:回传占位符解析器
ii. EmbeddedValueResolverAware:回传占位符解析器
iii. ResourceLoaderAware:回传资源加载器
iv. ApplicationEventPublisherAware:回传事件发布器
v. MessageSourceAware:回传国际化资源
vi. ApplicationStartupAware:回传应用其他监听对象,可忽略
vii. ApplicationContextAware:回传Spring容器ApplicationContext
iv. ApplicationEventPublisherAware:回传事件发布器
v. MessageSourceAware:回传国际化资源
vi. ApplicationStartupAware:回传应用其他监听对象,可忽略
vii. ApplicationContextAware:回传Spring容器ApplicationContext
初始化
调用InitializingBean.afterPropertiesSet()
调用初始化方法
初始化后
调用BeanPostProcessor.postProcessAfterInitialization()方法
所有非懒加载Bean都创建成功之后,调用SmartInitializingSingleton.afterSingletonsInstantiated()方法
SmartInitializingSingleton&InitializingBean区别
SmartInitializingSingleton接口只能作用于非惰性单实例Bean,InitializingBean接口无此要求。
SmartInitializingSingleton接口是在所有非惰性单实例初始化完成之后进行激活回调,InitializingBean接口是在每一个Bean实例初始化完成之后进行激活回调。
异常处理
bean的销毁
重新设置刷新标识
清空缓存数据
监听器
创建事件多播器
initApplicationEventMulticaster()
new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
ApplicationListener接口的监听器解析过程
refresh->registerListeners
将监听器的名字添加到多播器中,addApplicationListenerBean
将监听器的名字添加到多播器中,addApplicationListenerBean
在prepareBeanFactory中注册了类型为ApplicationListenerDetector的BeanPostProcessor
在初始化后的BeanPostProcessor中调用ApplicationListenerDetector
将监听器添加到多播器中:addApplicationListener
将监听器添加到多播器中:addApplicationListener
这里思考一个问题?
为什么registerListeners注册了一遍监听器
在BeanPostProcessor中又添加一次呢?
为什么registerListeners注册了一遍监听器
在BeanPostProcessor中又添加一次呢?
答案:为了懒加载的漏网之鱼!
@EventListener注解的解析过程
在准备工作Bean定义中注册了2个关于解析@EventListener
调用
EventListenerMethodProcessor.afterSingletonsInstantiated
处理@EventListener
EventListenerMethodProcessor.afterSingletonsInstantiated
处理@EventListener
创建监听器:
factory.createApplicationListener
->add ApplicationListenerMethodAdapter
factory.createApplicationListener
->add ApplicationListenerMethodAdapter
注册监听器到容器中:
AbstractApplicationContext#addApplicationListener
AbstractApplicationContext#addApplicationListener
context.publishEvent
SimpleApplicationEventMulticaster#multicastEvent()
接口
ApplicationListener.onApplicationEvent
onApplicationEvent
直接调用
注解
ApplicationListener.onApplicationEvent
ApplicationListenerMethodAdapter#onApplicationEvent
通过反射调用
解析BeanDefinition
invokeBeanFactoryPostProcessors
0 条评论
下一页