Spring5IoC源码
2021-07-16 21:37:28 5 举报
Spring 源码
作者其他创作
大纲/内容
执行postProcessMergedBeanDefinition方法
是
getSingleton
获取所有实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类名字postProcessorNames
设置excludeFilters
设置命名规则和代理方式(默认不设置)
实例为AnnotatedGenericBeanDefinition;解析bean的作用域,如果没有设置的话,默认为单例;通过注解获取name的值或自动生成一个去大写的版本beanName;
已处理
getMergedLocalBeanDefinition
判断是否是配置类,如果是的话,加入到configCandidates集合。在判断的时候,还会标记配置类属于Full配置类,还是Lite配置类。
如果构造函数或工厂方法已经解析过;是否需要自动注入
如果是,将该属性解析到的bean的信息放进cachedFieldValue,并设置为可以从缓存中获取
//解析parser.parse(candidates);
如果最终没有找到匹配的构造函数,则进行异常处理
单讲AutowiredAnnotationBeanPostProcessor
判断BeanFactoryPostProcessor是否是BeanDefinitionRegistryPostProcessor的实例
earlySingletonObjects.get(beanName);
有成员配置类,递归解析
需要跳过,结束当前循环
FactoryBean 是一个特殊的 Bean(工厂 Bean,自己实例化自己。普通 Bean 都是利用反射实例),调用它之前会先调用getObject()。BeanFactory 是一个 Bean 的工厂。为了区分 FactoryBean和 FactoryBean 创建的 bean 实例,Spring 使用了 “&” 前缀。假设我们的 beanName 为 person,则 getBean(\"person\") 获得的是 MyFactoryBean 通过 getObject()方法创建的 bean 实例;而 getBean(\"&person\")获得的是 MyFactoryBean本身。
开发人员实现了的事件广播器
重要的几个集合processedBeans:是否执行过后置处理器的集合;regularPostProcessors:普通的bean工厂后置处理器集合;registryProcessors:bean定义注册表后置处理器集合;currentRegistryProcessors:本次要执行的bean定义注册表后置处理器集合;priorityOrderedPostProcessors:存放实现了PriorityOrdered接口的bean工厂后置处理器集合;orderedPostProcessorNames:存放实现了Ordered接口的bean工厂后置处理器beanName集合;nonOrderedPostProcessorNames:存放普通bean工厂后置处理器beanName集合;orderedPostProcessors:存放实现了Ordered接口的bean工厂后置处理器集合;nonOrderedPostProcessors:存放普通bean工厂后置处理器集合;bean定义注册表后置处理器继承于bean定义后置处理器也就是BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
获取所有未被调用的的BeanDefinitionRegistryPostProcessor实现类名字postProcessorNames
如果没有使用注解,并且没有参数
存在 “父定义”:使用 “父定义” 的参数构建一个 RootBeanDefinition,然后进行覆盖。不存在 “父定义”,并且类型是 RootBeanDefinition:直接返回一个克隆。不存在 “父定义”,但是类型不是 RootBeanDefinition:构建一个 RootBeanDefinition。
//拓展的空方法postProcessBeanFactory(beanFactory);
如果没有,执行resolveFieldValue重新解析
获取并判断是否有父类BeanFactory;如果有父类且当前不存在我们要找的bean定义则递归在父类找;
拿到缓存中已解析的构造函数或工厂方法constructorToUse,如果不为空且入参的bean定义标记了构造函数参数已解析,判断构造函数参数如果不为空,则对构造函数参数进行解析
不是
循环所有BeanFactoryPostProcessor
processConfigurationClass方法
调用父类
是否需要自动注入
循环代码
最终Bean定义都存放在beanDefinitionMap、beanDefinitionNames这两个Map中
通过反射为属性赋值
doGetBean
1.直接执行BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法2.添加到registryProcessors(用于最后执行postProcessBeanFactory方法)
判断是否是对应类型(PriorityOrdered或者 Ordered)
循环所有MergedBeanDefinitionPostProcessor
获取dependsOn
构造函数解析,首先检查是否存在于缓存中
applyBeanPostProcessorsAfterInitialization
虚线箭头代表:额外注释(重要)
调用FactoryBean的getObject方法获取对象实例
new DefaultListableBeanFactory();
resolvedCachedArgument
register(componentClasses);
将所有PropertyValues中的属性填充到bean中
最终返回需要注入的 bean 实例
循环调用所有Bean
绝大数时候执行此方法doResolveDependency(没有深究)
beforeSingletonCreation(beanName);
分别执行上面对应集合(priorityOrderedPostProcessors、orderedPostProcessorNames、nonOrderedPostProcessorNames)的postProcessBeanFactory方法
循环所有SmartInstantiationAwareBeanPostProcessor
singletonObjects.get(beanName);
如果是新的单例对象,将beanName和对应的bean实例添加到缓存中(singletonObjects、registeredSingletons)
打印日志
检查dep是否依赖于beanName,即检查是否存在循环依赖;如果是循环依赖则抛异常
如果需要注入的bean没有缓存实例,那么 instanceCandidate是一个 Class对象,再根据 getBean()方法去获取对应的实例。
设置字段可访问
postProcessAfterInstantiation
BeanFactory是否注册过InstantiationAwareBeanPostProcessors
//对@AutoWired标记的属性进行依赖注入执行postProcessProperties
如果不为空,则代表构造函数有解析参数。找到参数数量一样的构造函数,则根据参数值来匹配参数类型。
:代码块
空
解析@Bean方法将@Bean方法转化为BeanMethod对象
如果是快捷方式的依赖描述,则直接通过候选者的名称来择取Bean,返回(传入的是基础类,这个条件此时不成立)
处理BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口方法,这里BeanFactoryAware的接口要注意,如果前面配置类有CGLIB动态代理的话,这里这个方法就重复了,也就是setBeanFactory被重复调用了两次,前面一次是在EnhancedConfiguration接口的方法。
执行postProcessBeforeInstantiation
这儿就是构造函数注入
解析 @ImportResource 注解导入xml配置
合并Processors到registryProcessors(用于最后执行postProcessBeanFactory方法)
循环candidateNames数组
这儿就是@Autowrie属性注入①封装成InjectionMetadata用于后续调用inject放实现注入
doRegisterBean
invokeBeanFactoryPostProcessors(beanFactory);
metadata为空或者被改变执行buildAutowiringMetadata
beforePrototypeCreation(beanName);
根据beanName获得BeanDefinition判断此BeanDefinition是否已经被处理过了。
false
默认注册一些有用的 bean,也可以选择覆盖
添加后置处理器
如果不为空,循环dependsOn
afterSingletonCreation(beanName);
不是 singleton 和 prototype;可能是request之类的
//注册监听器registerListeners
将发布的事件转化成ApplicationEvent对象
如果构造函数有解析参数并且匹配到参数数量一样构造函数,将解析的构造函数和参数放到缓存。
需要自动注入
// 创建单例之后删除singletonsCurrentlyInCreation中的beanName。afterSingletonCreation(beanName);
递归调用parse
Spring重新打包了CGLIB
半成品缓存没有,且允许早期引用,尝试从单例工厂缓存中查找有没有此Bean的工厂类存在
判断缓存是否为null&& 获取bean
// 进行依赖解决,获取符合条件的beanresolveDependency
如果当前遍历到的构造函数的参数个数小于我们所需的参数个数,则直接跳过该构造函数
判断resolvedValues,也就是构造参数解析的值是否为空,构造ArgumentsHolder
放入到半成品缓存,并将工厂类从工厂缓存中移除
直接调用ApplicationListener的onApplicationEvent(event)方法
ImportSelector注入
获取到事件广播器,调用事件广播器的multicastEvent方法来广播事件
//断当前bean是否需要代理,如果需要,则进行bean封装wrapIfNecessary
getBeanFactory();
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
检查autowiredBeanName对应的bean的类型是否为field的类型
实例化Bean对象并设置到bean包装类中去并返回。
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
查找使用@Autowire注解的元数据
先尝试从成品缓存获取
判断并标记是否是Full或者Lite配置类
如果mbd不是合成的 && 存在InstantiationAwareBeanPostProcessor,则遍历处理InstantiationAwareBeanPostProcessor
首先检查beanName对应的bean实例是否在缓存中存在,如果已经存在,则直接返回
没有成员配置类
如果存在父类,递归
prepareBeanFactory(beanFactory);
只要有@Configuration、@Component、@ComponentScan、@Import、@ImportResource和@Bean中的其中一个注解则需要解析
解析beanName,主要是解析别名、去掉FactoryBean的前缀“&”
findAutowireCandidates
默认的构造函数
@Condition注解
调用给定的BeanFactoryPostProcessor(默认为空)
未被处理
设置类加载器设置bean表达式解析器添加属性编辑器的支持
finishRefresh
存在
DefaultListableBeanFactory.registerBeanDefinition()
//创建代理createProxy
循环postProcessorNames
registerDependentBeans
start
getBeanFactory(),返回DefaultListableBeanFactory类型的BeanFactory,该类也同时实现了ConfigurableListableBeanFactory接口。
refresh();
如果是单例,并且已经存在于单例对象缓存中
根据事件和类型调用getApplicationListeners方法获取所有监听该事件的监听器
为空,结束当前循环
这儿介绍的是AbstractAutoProxyCreator类的逻辑,也就是AOP和事务的逻辑
循环configCandidates
进行增强enhancer
解析 @Import 注解分配三种情况
解析@Autowired注解
//填充属性populateBean
如果解析的bean实例存在或者依赖的属性存在
如果返回flase,跳过之后的属性填充
循环所有InstantiationAwareBeanPostProcessor
排序(根据是否实现PriorityOrdered、Ordered接口和order值来排序)
doInvokeListener
设置lazyInit
执行getObject获取早期引用
获取所有实现Ordered接口的BeanDefinitionRegistryPostProcessor实现类名字postProcessorNames
//获取候选者的注解属性findAutowiredAnnotation
循环candidates(candidates是configCandidates集合转化)
从缓存获取
从FactoryBean创建的单例对象的缓存中获取该bean实例
循环所有BeanPostProcessor
AnnotationConfigUtils.registerPostProcessor()
applyMergedBeanDefinitionPostProcessors
不需要
根据cacheKey在缓存中查找对象metadata
//从FactoryBean获取对象实例getObjectFromFactoryBean
否
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()
:注释内容(重要)
ApplicationContextAwareProcessor类实现了BeanPostProcessor接口,其中主要是复写了postProcessBeforeInitialization方法,其作用主要是用来对 Aware系列接口的支持,发现Bean实现了Aware系列接口,就调用其相应的方法
执行postProcessBeanDefinitionRegistry方法
//加载bean定义信息loadBeanDefinitions
constructorToUse != null && argsToUse != null && argsToUse.length > parameterCountbreak;
异步遍历执行invokeListener方法来唤醒监听器处理事件
this();
失败抛异常:大概在循环引用中。
//初始化国际化资源处理器initMessageSource();
排序
初始化默认的事件广播器SimpleApplicationEventMulticaster对象
循环所有BeanDefinitionName
包含@Condition注解跳过执行下一个Bean循环
如果依赖的对象有多个实例,根据@Primary、@Priority和名称依次进行匹配注入determineAutowireCandidate
Prototype
如果构造函数没有被缓存或者构造函数参数没有解析
如果配置了initMethod 就反射执行initMethod方法
循环sourceClass
判断是否需要跳过 @Conditional
对给定的构造函数排序:先按方法修饰符排序:public>非public,再按构造函数参数个数排序:参数多的排前面
invokeAwareMethods
对bean实例进行后置处理,执行所有已注册的BeanPostProcessor的postProcessAfterInitialization方法
@Autowrie的属性即系属于此类
Spring容IOC容器中获取所有的符合类型的Bean
finishBeanFactoryInitialization(beanFactory);
invokeInitMethods
是一个空Bean就是直接返回
factoryBeanObjectCache缓存中获取该FactoryBean创建的对象实例
转化为SourceClass
拿到依赖类所有的实现类的beanName
没有
name以“&”为前缀,但是beanInstance不是FactoryBean,则抛异常
循环处理scannedBeanDefinitions集合
//空方法onRefresh
获取所有BeanPostProcessor实现类名字postProcessorNames
将指定的bean注册为依赖于自动装配的bean
code
postProcessBeforeInitialization
找到类型差异权重值最小的值,选择此构造函数。如果存在多个相同最小候选者权重值,都添加(如果是严格模式,抛出异常)。
循环处理ComponentScan
是否存在方法覆写
遍历原始的构造函数候选者
不存在
beanFactory.addBeanPostProcessor(postProcessor);
获取dep对应的bean实例,如果dep还没有创建bean实例,则创建dep的bean实例
registerBeanPostProcessors(beanFactory);
循环候选者,将beanName及对应的实例或者Class对象放入到Map中
可以直接使用ApplicationContext实例来调用publishEvent方法来发布事件
其他,也就是说如果beanInstance是FactoryBean,并且name以“&”为前缀,直接返回beanInstance
判断是否我们已经在创建此bean实例
冻结所有bean定义
初始化生命周期处理器
一般用于AOP,如AspectJAutoProxyRegistrar
只有一个候选者,直接使用。
如果还有成员配置类,递归解析内部类
//事件发布publishEvent
尝试解析beanClass的原始类(针对CGLIB代理)
addCandidateEntry
ConfigurationClassPostProcessor.postProcessBeanFactory()
checkConfigMembers
//注册该beanbeanFactory.registerSingleton
针对不同的scope进行bean的创建
// getEarlyBeanReference方法的作用:应用后置处理器SmartInstantiationAwareBeanPostProcessor,允许返回指定bean的早期引用,或者代理引用
忽略一些类的自动装配直接装配一些类
enhanceConfigurationClasses(beanFactory);
如果已经找到满足的构造函数 && 目标构造函数需要的参数个数大于当前遍历的构造函数的参数个数则终止,因为遍历的构造函数已经排过序,后面不会有更合适的候选者了
成品缓存没有,且bean正在创建,尝试从半成品缓存获取
//获取bea定义getMergedLocalBeanDefinition
this.scanner = new ClassPathBeanDefinitionScanner(this);
调用registryProcessors的处理器
有选构造函数 || 注入方式为AUTOWIRE_CONSTRUCTOR || 有构造函数的参数值 || args不为空,则执行构造函数自动注入
AbstractAutoProxyCreator方法的实现代理增强
this.reader = new AnnotatedBeanDefinitionReader(this);
如果Bean的工厂类存在
向右的实线箭头代表:方法内部调用的代码块或其他方法
应用后置处理器InstantiationAwareBeanPostProcessor
循环beanFactoryPostProcessors(默认为空)
遍历所有构造函数候选者,找出符合条件的构造函数
postProcessAfterInitialization
获取需要提前发布的事件,并遍历广播出去
//尝试从缓存中获取bean(或者从单例工厂缓存中创建原始引用或者代理引用)getSingleton
注册用于销毁的bean,执行销毁操作的有三种:自定义destroy方法、DisposableBean接口、DestructionAwareBeanPostProcessor
isFactoryBean
如果postProcessProperties 返回null,再调用 postProcessPropertyValues这个过时的方法
只是普通的BeanFactoryPostProcessor, 添加到regularPostProcessors(用于最后执行postProcessBeanFactory方法)
将chosenCtors的构造函数作为候选者,如果构造函数只有一个 && arg为null && bean定义没有构造函数。则直接实例化Bean对象并设置到bean包装类中去,最终返回bean包装类。
解析@PropertySource注解
configCandidates数组是否为空
@PostConstruct的调用就是此,具体是InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization方法。AbstractAutoProxyCreator方法的实现判断是否跳过代理(AOP)
getObjectForBeanInstance
这儿就是@Autowrie属性注入②
处理手动调用scan的逻辑,不是重点逻辑,不做讲解
applyBeanPostProcessorsBeforeInstantiation
从beanFactory中获取事件广播器
调用determineCandidateConstructors
将所有监听器根据Order进行排序
如果为空,则代表给出了显示的参数(默认null)。找到参数数量一样的构造函数,构造ArgumentsHolder。 new ArgumentsHolder(explicitArgs);
解析beanName对应的Bean的类型,对override属性进行标记及验证。
ImportBeanDefinitionRegistrar注入
// 利用构造方法进行实例 BeanUtils.instantiateClass(constructorToUse);
如果属性依赖注入的bean只有一个(正常都是一个)
执行postProcessAfterInitialization
设置includeFilters
applyBeanPostProcessorsBeforeInitialization
解析@ComponentScan注解
解析自动装配模式为AUTOWIRE_BY_NAME和AUTOWIRE_BY_TYPE(xml的配置,现在几乎不用),忽略
//解析扫描包获得scannedBeanDefinitions集合
ApplicationListenerDetector
:重要知识点
//解析通用注解@Lazy,@Primary,@DependsOn,@Role,@DescriptionAnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
向下的实线箭头代表:顺序执行
如果没有,解析参数数量和参数
//方法自动注入AutowiredMethodElement.inject
循环所有beanNames
判断是否是 @Configuration配置类
一定会调用ConfigurationClassPostProcessor,因为这是Spring自带的后置处理器;其他自定义的处理器则调用对应的postProcessBeanDefinitionRegistry方法
一定会调用ConfigurationClassPostProcessor,因为这是Spring自带的后置处理器;其他自定义的处理器则调用对应的postProcessBeanFactory方法
GenericApplicationContext();
获取所有实现PriorityOrdered、Ordered接口和剩下未被调用的BeanFactoryPostProcessor实现类名字postProcessorNames
beanFactory.getBean
不为空
缓存是否有值
registerBeanPostProcessors
返回并封装成InjectionMetadata
循环所有BeanDefinitionRegistryPostProcessor
singletonFactories.get(beanName);
//创建单例之前添加到singletonsCurrentlyInCreationbeforeSingletonCreation(beanName);
执行afterPropertiesSet
retrieveApplicationListeners
刷新完毕事件传播到生命周期处理器
根据bean定义的解析构造函数模式(true: 宽松模式(默认),false:严格模式),将argsHolder的参数和paramTypes进行比较
processConfigBeanDefinitions(registry);
说明
是factoryBean 参数为\"&\"+beanName;不是,参数为beanName;
如果有,则直接从缓存中解析属性
如果name以“&”为前缀
调用regularPostProcessors的处理器
buildAutowiringMetadata
注册过
检测是否使用任何自定义Bean名称生成策略,如果没有使用的默认的
//对bean实例进行后置处理,执行所有已注册的BeanPostProcessor的postProcessAfterInitialization方法postProcessObjectFromFactoryBean
将使用了@Autowire注解的候选者添加到candidates
判断候选者是否有注解属性
true
清空currentRegistryProcessors.clear();
//初始化应用事件广播器initApplicationEventMulticaster
//属性自动注入AutowiredFieldElement.inject
getBean
parameterCount < minNrOfArgscontinue;
普通注入
如果beanInstance不是FactoryBean(也就是普通bean),则直接返回beanInstance
如果是配置类
Singleton
//非容器类型属性,按类型去IOC容器内择取所有类型匹配的候选者 findAutowireCandidates
不需要跳过
//根据basePackages执行真正的扫描doScan(StringUtils.toStringArray(basePackages));
new AnnotationConfigApplicationContext();
afterPrototypeCreation(beanName);
获取Spring容器BeanFactory对象
最终注册 Spring 内置的后置处理器:ConfigurationClassPostProcessor(最重要),AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,EventListenerMethodProcessor,DefaultEventListenerFactory
resolvePreparedArguments
//在指定Bean中查找使用@Autowire注解的元数据findAutowiringMetadata
跳过不需要代理的类
//开始初始化preInstantiateSingletons();
resolveCachedArguments
//应用上下文感知处理器ApplicationContextAwareProcessor
//准备刷新prepareRefresh();
如果bw为空,属性不为空,抛异常,无法将属性值应用于null实例
获取beanClass声明的构造函数(如果没有声明,会返回一个默认的无参构造函数)的数组
beanInstance是FactoryBean,但name不带有“&”前缀
//真正的解析方法doProcessConfigurationClass
//获取需要增强的类getAdvicesAndAdvisorsForBean
获得所有已注册的BeanDefinition的Name放进candidateNames数组
如果存在父类递归解析
判断ConfigurableListableBeanFactory是否是BeanDefinitionRegistry的实例
earlySingletonExposure判断是否需要提早曝光实例:单例 && 允许循环依赖 && 当前bean正在创建中
从BeanFactory获取事件广播器的bean
0 条评论
回复 删除
下一页