5.6registerBeanPostProcessors(beanFactory)
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
/**
AutowiredAnnotationProcessor 实现了PriorityOrdered
CommonAnnotationProcessor 实现了PriorityOrdered
AnnotationAwareAspectJAutoProxyCreator 实现了ordered
*/
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
/**
ApplicationContextAwareProcessor
ApplicationListenerDetector
ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
*/
//上面3个+下面3个 + 1个 BeanPostProcessorChecker = 7
int beanProcessorTargetCount = beanFactory
.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
beanFactory.addBeanPostProcessor
(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
//实现了 PriorityOrdered, BeanPostProcessors
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
//实现了 PriorityOrdered 且是 MergedBeanDefinitionPostProcessor类型
//就是 internalPostProcessors
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
//实现了 Ordered, BeanPostProcessors
List<String> orderedPostProcessorNames = new ArrayList<>();
//既没有实现PriorityOrdered也没有实现Ordered PriorityOrdered, BeanPostProcessors
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
/**
ApplicationContextAwareProcessor
ApplicationListenerDetector
ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
*/
//筛选类型放入对应集合
//首先创建并注册实现了PriorityOrdered的BeanPostProcessors
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
/**
* doCreate 实例化BeanPostProcessor
* 放入beanFactory
*/
BeanPostProcessor pp = beanFactory.getBean
(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}else {
nonOrderedPostProcessorNames.add(ppName);
}
}
/***
* 0 = {CommonAnnotationBeanPostProcessor@1739}
* 1 = {AutowiredAnnotationBeanPostProcessor@1689}
*/
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
//上面是放入beanFactory
//这里是放入beanPostProcessors集合中
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// 下一步创建并注册实现了Ordered的BeanPostProcessors
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String ppName : orderedPostProcessorNames) {
/**
* doCreate 实例化BeanPostProcessor
* 放入beanFactory
*/
BeanPostProcessor pp = beanFactory.getBean
(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
/**
AnnotationAwareAspectJAutoProxyCreator在这里加入的
*/
sortPostProcessors(orderedPostProcessors, beanFactory);
//上面是放入beanFactory
//这里是放入beanPostProcessors集合中
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// 创建并注册没有实现任何Ordered的BeanPostProcessors
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String ppName : nonOrderedPostProcessorNames) {
/**
* doCreate 实例化BeanPostProcessor
* 放入beanFactory
*/
BeanPostProcessor pp = beanFactory.getBean
(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
/***
*空集合
*/
//上面是放入beanFactory
//这里是放入beanPostProcessors集合中
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// 最后创建并注册内部BeanPostProcessors
// MergedBeanDefinitionPostProcessor类型
/**
0 = {CommonAnnotationBeanPostProcessor@2252}
1 = {AutowiredAnnotationBeanPostProcessor@2253}
*/
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// Re-register post-processor for detecting inner beans as ApplicationListeners,
// moving it to the end of the processor chain (for picking up proxies etc).
//注册了一个BeanPostProcessor?
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
5.6.1getBeanNamesForType
5.6.1.1getMergedLocalBeanDefinition(beanName)
1.遍历所有的beanDefinitionNames
2.首先从map缓存中获取 获取到直接返回
3.获取不到首先根据beanDefinitionName获取对应 beanDefinition
4.判断是否有父类,没有父类直接将当前BD包装返回一个RootBeanDefinition
5.有父类,继续递归调用getMergedBeanDefinition(String name)
先从缓存mergedBeanDefinitions中获取 如果获取不到判断是否有父类 没有父类
如果有父类 那么先合并父类的BD 如果父类还有父类 那么先合并爷爷类
等父类的BD都合并完毕 基于父类去合并bean的BD
具体做法是 基于父类 使用子类的属性覆盖父类的属性
比如 父类有A方法 B属性 C属性
子类有A方法 B属性 没有C属性
那么在覆盖的时候 子类A方法会覆盖父类A方法
那么在覆盖的时候 子类B属性会覆盖父类B属性
那么在覆盖的时候 子类没有C属性 父类有C属性 因为是直接基于父类构建所以子类也有C属性
6.判断类型是否匹配
7.如果匹配加入返回的集合中
5.6.2遍历BPP集合对BPP进行分类
1.实现了PriorityOrdered接口
2.实现了Ordered接口
3.没有实现任何Order接口
4.BPP类型是MergedBeanDefinitionPostProcessor
5.6.3创建&排序&注册BeanPostProcessor
使用doGetBean创建Bean,所谓的注册就是加入BeanFactory的集合中。
以实现了PriorityOrdered的BeanPostProcessors为例
//筛选类型放入对应集合
// 首先创建并注册实现了PriorityOrdered的BeanPostProcessors
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
/**
* doCreate 实例化BeanPostProcessor
*/
BeanPostProcessor pp = beanFactory.getBean
(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}else {
nonOrderedPostProcessorNames.add(ppName);
}
}
/***
* 0 = {CommonAnnotationBeanPostProcessor@1739}
* 1 = {AutowiredAnnotationBeanPostProcessor@1689}
*/
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
5.7initMessageSource
5.8onRefresh:扩展点
5.9finishBeanFactoryInitialization
实例化 所有的非懒加载的单例bean
5.9.1preInstantiateSingletons
@Override
public void preInstantiateSingletons() throws BeansException {
if (logger.isTraceEnabled()) {
logger.trace("Pre-instantiating singletons in " + this);
}
/***
* 放置所有bean的name
*/
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// Trigger initialization of all non-lazy singleton beans...
/***
* 循环所有需要创建的beanName 依次创建bean
*/
for (String beanName : beanNames) {
/***
合并父BeanDefinition对象
GenericBeanDefinition源码实现非常的的简单,只增加了一个parentName的属性值
其余的实现都在父类AbstractBeanDefinition里
备注:若你是xml配置,最初被加载进来都是一个GenericBeanDefinition,之后再逐渐解析的。
ChildBeanDefinition:子Bean定义信息,依赖于父类RootBeanDefinition
ChildBeanDefinition是一种bean definition
它可以继承父类的设置,即ChildBeanDefinition对RootBeanDefinition有一定的依赖关系。
功能和GenericBeanDefinition差不多所以此处忽略~
从spring 2.5 开始,提供了一个更好的注册bean definition类
GenericBeanDefinition,所以以后推荐使用它。
RootBeanDefinition:
一个RootBeanDefinition定义表明它是一个可合并的bean definition:
即在spring beanFactory运行期间,可以返回一个特定的bean
但在Spring2.5以后,我们绝大多数情况还是可以使用GenericBeanDefinition来做。
我们非常熟悉的final RootBeanDefinition mbd =
getMergedLocalBeanDefinition(beanName);
这句代码,就是去合并parent的属性进来,这样体现了继承的强大。属性也才完整。*/
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
/***
* 非抽象 && 单例 && 非懒加载
*/
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
//判断是否实现了FactoryBean接口
//如果实现了FactoryBean接口 那么需要先创建FactoryBean
//在bean非懒加载情况下 会立刻再创建FactoryBean生成的Bean
if (isFactoryBean(beanName)) {
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof FactoryBean) {
FactoryBean<?> factory = (FactoryBean<?>) bean;
boolean isEagerInit;
if (System.getSecurityManager() != null &&
factory instanceof SmartFactoryBean) {
isEagerInit =
AccessController.doPrivileged(
(PrivilegedAction<Boolean>)
((SmartFactoryBean<?>) factory)::isEagerInit,
getAccessControlContext());
}else {
//如果是SmartFactoryBean类型
//且SmartFactoryBean的isEagerInit()返回的是true
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean<?>) factory).isEagerInit());
}
/***
* 是否立即加载 如果是立即加载 那么开始创建bean
*/
if (isEagerInit) {
/***
* 创建bean入口
*/
getBean(beanName);
}
}
}else {
//懒加载
getBean(beanName);
}
}
}
// Trigger post-initialization callback for all applicable beans...
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
smartSingleton.afterSingletonsInstantiated();
return null;
}, getAccessControlContext());
}
else {
smartSingleton.afterSingletonsInstantiated();
}
}
}
}
5.9.1.1遍历beanDefinitionNames
5.9.1.2合并beanDefinition
5.9.1.3判断非抽象&&单例&&饥渴加载
lazyInit默认是false即不采用懒加载,如果你希望自己配置的bean不要懒加载,而是在Spring容器初始化时就率先去加载它,那你完全可以为这个bean配置属性lazyInit的值为false。
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit())
5.9.1.4转换beanName,判断是否是FactoryBean
@Override
public boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException {
//转换beanName 去掉&
//注意这里是去掉了&
//所以不管是传入&userFactoryBean还是传入userFactory
//最后返回的都是userFactory
//userFactory对应的类型就是FactoryBean
//最后具体返回的是FactoryBean还是FactoryBean创建的对象
//取决于传入的是&userFactoryBean还是userFactory
//同时还做了别名转换
String beanName = transformedBeanName(name);
//从缓存中获取beanInstance
Object beanInstance = getSingleton(beanName, false);
if (beanInstance != null) {
//返回 是否是 FactoryBean
return (beanInstance instanceof FactoryBean);
}
if (!containsBeanDefinition(beanName)
&& getParentBeanFactory() instanceof ConfigurableBeanFactory) {
return ((ConfigurableBeanFactory)
getParentBeanFactory()).isFactoryBean(name);
}
return isFactoryBean(beanName, getMergedLocalBeanDefinition(beanName));
}
protected String transformedBeanName(String name) {
//在BeanFactoryUtils的方法transformedBeanName中其实就干了一件事
//如果发现name以一个或多个符号“&”为前缀
//那就剔除掉name前缀中的“&”,直到name前缀中的符号“&”都剔除干净了才返回name。
return canonicalName(BeanFactoryUtils.transformedBeanName(name));
}
public String canonicalName(String name) {
String canonicalName = name;
// Handle aliasing...
String resolvedName;
do {
resolvedName = this.aliasMap.get(canonicalName);
if (resolvedName != null) {
canonicalName = resolvedName;
}
}
while (resolvedName != null);
return canonicalName;
}
可以看到,在方法canonicalName中,其实就是通过参数传进来的name,到别名缓存alilasMap中获取bean的实际名称,之前我们在BeanDefinition注册到Spring容器之后,也看到了别名的注册逻辑。
canonicalName方法的处理也比较好理解,因为我们是通过getBean方法,让Spring来实例化name对应的bean,那Spring肯定要确保你传进来的bean名称name,得要尽最大的可能获取到Spring容器中的BeanDefinition。
当然,如果用户调用getBean方法时传进来一些错误的name,Spring是无可奈何的,肯定是获取不到相应的BeanDefinition来实例化bean的,但是,如果你传进来的name是bean的别名,那Spring还是有一定的纠错能力的,而方法canonicalName就是Spring将别名转换为bean实际名称的一个方法。
比如当bean在注册BeanDefinition时,BeanDefinition相应注册的名称为student,但是,如果这个bean的别名同时又被设置为student1,这个时候如果你通过student1这个别名,去Spring容器中获取BeanDefinition当然就获取不到了。
因为在别名缓存aliasMap中,存放了bean的别名student1到bean的实际名称student的映射,所以,在方法canonicalName中,就可以通过别名缓存aliasMap,根据别名student1获取bean的实际名称student,这样Spring再拿着bean的实际名称student,就可以从Spring容器中获取到bean的BeanDefinition了。
protected boolean isFactoryBean(String beanName, RootBeanDefinition mbd) {
Class<?> beanType = predictBeanType(beanName, mbd, FactoryBean.class);
//判断是否是FactoryBean类型
return (beanType != null && FactoryBean.class.isAssignableFrom(beanType));
}
@Nullable
protected Class<?> predictBeanType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
Class<?> targetType = mbd.getTargetType();
if (targetType != null) {
return targetType;
}
if (mbd.getFactoryMethodName() != null) {
return null;
}
//resolveBeanClass
//获取mbd配置的bean类名 将bean类名解析为Class对象
//并将解析后的Class对象缓存在mdb中以备将来使用
return resolveBeanClass(mbd, beanName, typesToMatch);
}
5.9.1.4.1doGetBean获取FactoryBean实例
具体的看5.9.1.6.1
如果是实现了FactoryBean接口类型那么调用doGetBean加载FactoryBean
注意这里获取的是FactoryBean实例
注意这里获取的是FactoryBean实例
注意这里获取的是FactoryBean实例
//使用&+beanName 去获取Bean
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
获取到bean以后继续往下看。
然后会判断bean instanceof FactoryBean,如果是true。
那么调用doGetBean加载FactoryBean创建的bean。
if (bean instanceof FactoryBean) {
FactoryBean<?> factory = (FactoryBean<?>) bean;
boolean isEagerInit;
if (System.getSecurityManager() != null &&
factory instanceof SmartFactoryBean) {
isEagerInit = AccessController
.doPrivileged((PrivilegedAction<Boolean>)
((SmartFactoryBean<?>) factory)
::isEagerInit,getAccessControlContext());
}else {
//对于FactoryBean isEagerInit 默认是true
//对于SmartFactoryBean,因为可以重写isEagerInit() 所以这里需要特殊处理
//如果是SmartFactoryBean类型需要获取SmartFactoryBean的isEagerInit()返回值
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean<?>) factory).isEagerInit());
}
//是否立即加载 如果是立即加载 那么创建Factory创建的bean
if (isEagerInit) {
//创建bean入口
getBean(beanName);
}
}
当我们调用
context.getBean("&userFactoryBean");
protected <T> T doGetBean(
String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
throws BeansException {
//解析bean 如果以&开头 去掉& 如果是别名获取真正的名字
String beanName = transformedBeanName(name);
Object bean;
//获取到UserFactoryBean
Object sharedInstance = getSingleton(beanName);
//进入判断 直接根据名称返回对应的类型
if (sharedInstance != null && args == null) {
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
} else {
//省略部分代码
}
return (T) bean;
}
5.9.1.5判断不是FactoryBean
5.9.1.5.1doGetBean获取实例
调用doGetBean直接去加载bean,具体的看5.9.1.6.1
@Override
public Object getBean(String name) throws BeansException {
assertBeanFactoryActive();
return getBeanFactory().getBean(name);
}
@Override
public Object getBean(String name) throws BeansException {
//对应 getBean("orange")
return doGetBean(name, null, null, false);
}
由5.9.1.4和5.9.1.5可以看出来最后走的都是doGetBean。
但是getBean(beanName)中的参数beanName不一样!
getBean(FACTORY_BEAN_PREFIX + beanName);
getBean(beanName);
5.9.1.6.1doGetBean(name, null, null, false);
@SuppressWarnings("unchecked")
protected <T> T doGetBean(
String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
throws BeansException {
//解析bean 如果以&开头 去掉& 如果是别名获取真正的名字
String beanName = transformedBeanName(name);
Object bean;
/***
* 从缓存中获取如果一级缓存不在 则从二级缓存获取 如果二级缓存不在 则从三级缓存获取
* 如果三级缓存存在则从三级缓存拿出ObjectFactory调用getObject获取bean
//最后将bean从三级缓存移除 放到二级缓存
* singletonObjects 一级缓存池
* earlySingletonObjects 二级缓存池
* singletonFactories 三级缓存池
*/
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
/***
* 如果实现了FactoryBean接口 需要获取具体对象 要使用下面的方法进行获取
* 如果没有实现FactoryBean接口 会直接返回传递进来的beanInstance
*/
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
} else {
//当对象都是单例的时候会尝试解决循环依赖的问题
//但是原型模式下如果存在循环依赖的情况,那么直接抛出异常
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
// 检查父工厂是否存在该对象 spring mvc父子容器
BeanFactory parentBeanFactory = getParentBeanFactory();
// 如果beanDefinitionMap中也就是在所有已经加载的类中不包含beanName
// 那么就尝试从父容器中获取
//即先从子容器获取 子容器不存在 再从父容器获取
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
String nameToLookup = originalBeanName(name);
if (parentBeanFactory instanceof AbstractBeanFactory) {
return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
nameToLookup, requiredType, args, typeCheckOnly);
} else if (args != null) {
// Delegation to parent with explicit args.
return (T) parentBeanFactory.getBean(nameToLookup, args);
} else if (requiredType != null) {
// No args -> delegate to standard getBean method.
return parentBeanFactory.getBean(nameToLookup, requiredType);
} else {
return (T) parentBeanFactory.getBean(nameToLookup);
}
}
// 如果不是做类型检查,那么表示要创建bean,此处在集合中做一个记录
if (!typeCheckOnly) {
// 为beanName标记为已经创建(或将要创建)
markBeanAsCreated(beanName);
}
try {
// 此处要做类型转换,如果是子类bean的话,会合并父类的相关属性
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
// 检查mbd的合法性,不合格会引发验证异常
checkMergedBeanDefinition(mbd, beanName, args);
/**
处理depends on属性即处理创建先后顺序的依赖关系如A依赖B则B先创建才能创建A
如果存在依赖的bean的话,那么则优先实例化依赖的bean
使用Spring @DependsOn控制bean加载顺序
我们可以在bean A上使用@DependsOn注解,告诉容器bean B应该先被初始化。
*/
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
for (String dep : dependsOn) {
if (isDependent(beanName, dep)) {
throw new BeanCreationException();
}
registerDependentBean(dep, beanName);
try {
//继续doGetBean
getBean(dep);
} catch (NoSuchBeanDefinitionException ex) {
throw new BeanCreationException();
}
}
}
// Create bean instance.
// 创建bean的实例对象
if (mbd.isSingleton()) {
/***
* 从一级缓存singletonObjects获取bean对象
* 获取到了就直接返回
* 获取不到那么将传入的 createBean(beanName, mbd, args);
*/
sharedInstance = getSingleton(beanName, () -> {
try {
//创建Bean
return createBean(beanName, mbd, args);
} catch (BeansException ex) {
destroySingleton(beanName);
throw ex;
}
});
/***
* 如果实现了FactoryBean接口 需要获取具体对象 要使用下面的方法进行获取
* 如果没有实现FactoryBean接口 会直接返回传递进来的beanInstance
*/
bean = getObjectForBeanInstance
(sharedInstance, name, beanName, mbd);
} else if (mbd.isPrototype()) {
Object prototypeInstance = null;
try {
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
} finally {
afterPrototypeCreation(beanName);
}
bean = getObjectForBeanInstance
(prototypeInstance, name, beanName, mbd);
} else {
String scopeName = mbd.getScope();
if (!StringUtils.hasLength(scopeName)) {
throw new IllegalStateException();
}
Scope scope = this.scopes.get(scopeName);
if (scope == null) {
throw new IllegalStateException();
}
try {
Object scopedInstance = scope.get(beanName, () -> {
beforePrototypeCreation(beanName);
try {
return createBean(beanName, mbd, args);
} finally {
afterPrototypeCreation(beanName);
}
});
bean = getObjectForBeanInstance
(scopedInstance, name, beanName, mbd);
} catch (IllegalStateException ex) {
throw new BeanCreationException();
}
}
} catch (BeansException ex) {
cleanupAfterBeanCreationFailure(beanName);
throw ex;
}
}
if (requiredType != null && !requiredType.isInstance(bean)) {
try {
T convertedBean = getTypeConverter()
.convertIfNecessary(bean, requiredType);
if (convertedBean == null) {
throw new BeanNotOfRequiredTypeException();
}
return convertedBean;
} catch (TypeMismatchException ex) {
throw new BeanNotOfRequiredTypeException
(name, requiredType, bean.getClass());
}
}
return (T) bean;
}
5.9.1.6.1.1从缓存中获取
从缓存中获取 Object sharedInstance = getSingleton(beanName)
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
//是否应创建早期引用 allowEarlyReference is true
Object singletonObject = this.singletonObjects.get(beanName);
//一级缓存中该bean为空 且 当前 bean 正在创建才能去2级缓存拿
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
//2级缓存中获取
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
synchronized (this.singletonObjects) {
singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
singletonObject =
this.earlySingletonObjects.get(beanName);
if (singletonObject == null) {
//3级缓存中获取
ObjectFactory<?> singletonFactory
=this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects
.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
}
}
return singletonObject;
}
5.9.1.6.1.1.1如果缓存中存在
调用getObjectForBeanInstance
如果实现了FactoryBean接口 需要获取具体对象 要使用下面的方法进行获取
如果没有实现FactoryBean接口 会直接返回传递进来的beanInstance
/***
* 如果实现了FactoryBean接口 需要根据具体的beanName返回具体的bean
* 如果没有实现FactoryBean接口 会直接返回传递进来的beanInstance
*/
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
protected Object getObjectForBeanInstance(Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
/***
* 如果实现了FactoryBean接口 需要获取具体对象 要使用下面的方法进行获取
* 如果没有实现FactoryBean接口 会直接返回传递进来的beanInstance
*/
//name原始的名称&开头的
//beanName是去掉了&的名称
//判断name是否以&开头
if (BeanFactoryUtils.isFactoryDereference(name)) {
if (beanInstance instanceof NullBean) {
return beanInstance;
}
//进了这个方法beanInstance必须是实现了FactoryBean接口
if (!(beanInstance instanceof FactoryBean)) {
throw new BeanIsNotAFactoryException
(beanName, beanInstance.getClass());
}
}
// Now we have the bean instance, which may be a normal bean or a FactoryBean.
// If it's a FactoryBean, we use it to create a bean instance, unless the
// caller actually wants a reference to the factory.
if (!(beanInstance instanceof FactoryBean) ||
BeanFactoryUtils.isFactoryDereference(name)) {
//如果没有实现FactoryBean接口
return beanInstance;
}
Object object = null;
if (mbd == null) {
//缓存中获取
object = getCachedObjectForFactoryBean(beanName);
}
if (object == null) {
// Return bean instance from factory.
FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
// Caches object obtained from FactoryBean if it is a singleton.
if (mbd == null && containsBeanDefinition(beanName)) {
mbd = getMergedLocalBeanDefinition(beanName);
}
boolean synthetic = (mbd != null && mbd.isSynthetic());
//从FactoryBean中获取
//调用FactoryBean的getObject方法
//object = factory.getObject();
object = getObjectFromFactoryBean(factory, beanName, !synthetic);
}
return object;
}
5.9.1.6.1.1.2如果缓存中不存在
一般第一次进来的时候在缓存中就是不存在的。
//没有从缓存中获取到
else {
//当对象都是单例的时候会尝试解决循环依赖的问题
//但是原型模式下如果存在循环依赖的情况,那么直接抛出异常
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
// 检查父工厂是否存在该对象 spring mvc父子容器
BeanFactory parentBeanFactory = getParentBeanFactory();
// 如果beanDefinitionMap中也就是在所有已经加载的类中不包含beanName
// 那么就尝试从父容器中获取
//即先从子容器获取 子容器不存在 再从父容器获取
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
String nameToLookup = originalBeanName(name);
if (parentBeanFactory instanceof AbstractBeanFactory) {
return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
nameToLookup, requiredType, args, typeCheckOnly);
} else if (args != null) {
// Delegation to parent with explicit args.
return (T) parentBeanFactory.getBean(nameToLookup, args);
} else if (requiredType != null) {
// No args -> delegate to standard getBean method.
return parentBeanFactory.getBean(nameToLookup, requiredType);
} else {
return (T) parentBeanFactory.getBean(nameToLookup);
}
}
// 如果不是做类型检查,那么表示要创建bean,此处在集合中做一个记录
if (!typeCheckOnly) {
// 为beanName标记为已经创建(或将要创建)
markBeanAsCreated(beanName);
}
try {
// 此处要做类型转换,如果是子类bean的话,会合并父类的相关属性
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
// 检查mbd的合法性,不合格会引发验证异常
checkMergedBeanDefinition(mbd, beanName, args);
/**
处理depends on属性即处理创建先后顺序的依赖关系如A依赖B则B先创建才能创建A
如果存在依赖的bean的话,那么则优先实例化依赖的bean
使用Spring @DependsOn控制bean加载顺序
我们可以在bean A上使用@DependsOn注解,告诉容器bean B应该先被初始化。
*/
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
for (String dep : dependsOn) {
if (isDependent(beanName, dep)) {
throw new BeanCreationException();
}
registerDependentBean(dep, beanName);
try {
//继续doGetBean
getBean(dep);
} catch (NoSuchBeanDefinitionException ex) {
throw new BeanCreationException();
}
}
}
// 创建bean的实例对象
if (mbd.isSingleton()) {
/***
getSingleton
(String beanName, ObjectFactory<?> singletonFactory)
区别于上面的getSingleton(String beanName)
从一级缓存singletonObjects获取bean对象
获取到了就直接返回
获取不到那么执行:createBean(beanName, mbd, args);
*/
sharedInstance = getSingleton(beanName, () -> {
try {
//创建Bean
return createBean(beanName, mbd, args);
} catch (BeansException ex) {
destroySingleton(beanName);
throw ex;
}
});
/***
* 如果实现了FactoryBean接口 需要获取具体对象 要使用下面的方法进行获取
* 如果没有实现FactoryBean接口 会直接返回传递进来的beanInstance
*/
bean = getObjectForBeanInstance
(sharedInstance, name, beanName, mbd);
} else if (mbd.isPrototype()) {
Object prototypeInstance = null;
try {
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
} finally {
afterPrototypeCreation(beanName);
}
bean = getObjectForBeanInstance
(prototypeInstance, name, beanName, mbd);
} else {
String scopeName = mbd.getScope();
if (!StringUtils.hasLength(scopeName)) {
throw new IllegalStateException();
}
Scope scope = this.scopes.get(scopeName);
if (scope == null) {
throw new IllegalStateException();
}
try {
Object scopedInstance = scope.get(beanName, () -> {
beforePrototypeCreation(beanName);
try {
return createBean(beanName, mbd, args);
} finally {
afterPrototypeCreation(beanName);
}
});
bean = getObjectForBeanInstance
(scopedInstance, name, beanName, mbd);
} catch (IllegalStateException ex) {
throw new BeanCreationException();
}
}
} catch (BeansException ex) {
cleanupAfterBeanCreationFailure(beanName);
throw ex;
}
}
if (requiredType != null && !requiredType.isInstance(bean)) {
try {
T convertedBean = getTypeConverter()
.convertIfNecessary(bean, requiredType);
if (convertedBean == null) {
throw new BeanNotOfRequiredTypeException();
}
return convertedBean;
} catch (TypeMismatchException ex) {
throw new BeanNotOfRequiredTypeException
(name, requiredType, bean.getClass());
}
}
return (T) bean;
}
关键代码
/***
* 从一级缓存singletonObjects获取bean对象
* 获取到了就直接返回
* 获取不到那么将传入的 createBean(beanName, mbd, args);
*/
sharedInstance = getSingleton(beanName, () -> {
try {
/***
* 創建bean對象
*/
return createBean(beanName, mbd, args);
} catch (BeansException ex) {
destroySingleton(beanName);
throw ex;
}
});
/***
* 如果实现了FactoryBean接口 需要获取具体对象 要使用下面的方法进行获取
* 如果没有实现FactoryBean接口 会直接返回传递进来的beanInstance
*/
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
getSingleton(String n, ObjectFactory f)
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
Assert.notNull(beanName, "Bean name must not be null");
synchronized (this.singletonObjects) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
/**
* 如果当前对象正在被销毁
*/
if (this.singletonsCurrentlyInDestruction) {
throw new BeanCreationNotAllowedException();
}
/***
* 验证完要真正开始创建对象 先标识该bean正在被创建
因为bean创建过程复杂步骤很多需要标识
*/
beforeSingletonCreation(beanName);
/***
* 是否在singletonObjects里存在 存在就不再put
*/
boolean newSingleton = false;
boolean recordSuppressedExceptions
= (this.suppressedExceptions == null);
if (recordSuppressedExceptions) {
this.suppressedExceptions = new LinkedHashSet<>();
}
try {
/***
* singletonFactory 即 AbstractBeanFactory
* singletonFactory是函数式接口
* 注意是在这里创建的bean
* 具体创建过程看
* AbstractAutowireCapableBeanFactory#createBean
*/
singletonObject = singletonFactory.getObject();
newSingleton = true;
}
catch (IllegalStateException ex) {
singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
throw ex;
}
}
catch (BeanCreationException ex) {
if (recordSuppressedExceptions) {
for (Exception suppressedException :
this.suppressedExceptions) {
ex.addRelatedCause(suppressedException);
}
}
throw ex;
}
finally {
if (recordSuppressedExceptions) {
this.suppressedExceptions = null;
}
afterSingletonCreation(beanName);
}
if (newSingleton) {
//加入一级缓存注意此时放入的是singletonObject 从二三级缓存移除
addSingleton(beanName, singletonObject);
}
}
return singletonObject;
}
}
sharedInstance = getSingleton(beanName, () -> {return createBean(beanName, mbd, args);});
() -> {return createBean(beanName, mbd, args);是一个函数式接口ObjectFactory的匿名实现类。
真正的代码在AbstractAutowireCapableBeanFactory#createBean()
createBean
@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {
RootBeanDefinition mbdToUse = mbd;
/***
* 从RootBeanDefinition中获取类信息
*
* 锁定class,根据设置的class属性或者根据className来解析class
* beanName 参数只是为了抛出异常 哈哈哈
*/
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass()
&& mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// Prepare method overrides.
try {
// 验证及准备覆盖的方法,lookup-method replace-method
// 当需要创建的bean对象中包含了lookup-method和replace-method标签的时候
// 会产生覆盖操作
/*Spring的方法注入可分为两种
查找方法注入:用于注入方法返回结果,也就是说能通过配置方式替换方法返回结果。
即我们通常所说的lookup-method注入。
替换方法注入:可以实现方法主体或返回结果的替换。
即我们通常所说的replaced-method注入。
1. lookup-method注入
单例模式的bean只会被创建一次,IoC容器会缓存该bean实例以供下次使用
原型模式的bean每次都会创建一个全新的bean,IoC容器不会缓存该bean的实例。
那么如果现在有一个单例模式的bean引用了一个原型模式的bean呢?
如果无特殊处理,则被引用的原型模式的bean也会被缓存,这就违背了原型模式的初衷,
这时使用lookup-method注入可以解决该问题。
2. replaced-method注入
主要作用就是替换方法体及其返回值,其实现也比较简单
https://blog.csdn.net/lyc_liyanchao/article/details/82901216
https://blog.csdn.net/qq_36882793/article/details/106176923
*/
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException();
}
try {
// postProcessBeforeInstantiation
// 给BeanPostProcessors一个机会来返回代理来替代真正的实例
// 应用实例化前的前置处理器,用户自定义动态代理的方式
// 针对于当前的被代理类需要经过标准的代理流程来创建对象
//https://www.cnblogs.com/zhuxiaopijingjing/p/12617712.html
//InstantiationAwareBeanPostProcessor 可用于 创建自定义代理对象
// 意思是如果我们自己实例化了对象就不需要spring帮我们实例化了
//扩展点 如果想返回自定义的对象 可以使用实现该接口 返回自定义对象
//创建代理的第一个时机:让BeanPostProcessors 有机会返回一个目标bean的代理对象
//创建代理的第一个时机:让BeanPostProcessors 有机会返回一个目标bean的代理对象
//创建代理的第一个时机:让BeanPostProcessors 有机会返回一个目标bean的代理对象
//只有指定targetSource,才会创建代理 此时这里返回为null
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
//注意如果有 InstantiationAwareBeanPostProcessor类型的接口
//并返回了自定义对象 这里会直接返回
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
try {
/***
* 如果上面直接返回了bean 下面的doCreateBean就不会执行
*/
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
return beanInstance;
}
catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(
mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
}
}
doCreateBean
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
/***
* 创建bean实例 仅仅是创建bean实例
* instanceWrapper实现了 ConfigurablePropertyAccessor
* 是一个包装类 该类的属性可以编辑
*/
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
//允许 post-processors 修改 beanDefinition
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
//调用 MergedBeanDefinitionPostProcessor
//查找出满足条件的属性、方法, 将他们封装起来
//以便后面在填充属性的时候可以直接使用
//https://juejin.cn/post/6844904167945797640
applyMergedBeanDefinitionPostProcessors
(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException();
}
mbd.postProcessed = true;
}
}
/***
* 是否需要提前暴露
* 判断条件:
* 1.是单例
* 2.允许循环依赖
* 3.bean正在被创建
*/
boolean earlySingletonExposure
= (mbd.isSingleton() &&
this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
//需要提前暴露 加入3级缓存
if (earlySingletonExposure) {
/***
* singletonObjects 一级缓存池
* earlySingletonObjects 二级缓存池
* singletonFactories 三级缓存池
* 将ObjectFactory<?> singletonFactory 加入三级缓存 singletonFactories
* 并从二级缓存移除
* 放进去的是getEarlyBeanReference方法
*/
/*
getEarlyBeanReference放入了提前实例化但是未初始化的对象
可以看到,在方法getEarlyBeanReference中
主要就是执行后处理器SmartInstantiationAwareBeanPostProcessor的方法,
默认情况下是没有注册相应SmartInstantiationAwareBeanPostProcessor
那如果注册了SmartInstantiationAwareBeanPostProcessor类型的后处理器
默认会做些什么事呢?
Spring默认就把我们刚创建好的bean实例直接返回了。
说到底,这里同样是Spring留给我们的一个扩展点的,希望我们自定义实现接口 SmartInstantiationAwareBeanPostProcessor
然后重写方法getEarlyBeanReference
自定义早期单例的bean应该需要哪些东西
好让其他bean实例化时,得到符合需求的早期单例bean。
**/
addSingletonFactory(
beanName,
//如果有循环依赖 bean的代理对象就是在这里被创建的
//如果有循环依赖 bean的代理对象就是在这里被创建的
//如果有循环依赖 bean的代理对象就是在这里被创建的
() -> getEarlyBeanReference(beanName, mbd, bean)
);
}
//此时这个bean已经放入了 getEarlyBeanReference(beanName, mbd, bean)
Object exposedObject = bean;
try {
/***
* 1.属性填充
* 2.处理属性依赖
*/
populateBean(beanName, mbd, instanceWrapper);
/***
* 初始化bean
* 如果bean实现了以下接口
* BeanNameAware, BeanFactoryAware, ApplicationContextAware
* 则调用对应接口的方法
* 如果没有循环依赖 bean的代理对象就是在这里被创建的
* 如果没有循环依赖 bean的代理对象就是在这里被创建的
* 如果没有循环依赖 bean的代理对象就是在这里被创建的
*/
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
catch (Throwable ex) {
if (ex instanceof BeanCreationException &&
beanName.equals(((BeanCreationException) ex).getBeanName())) {
throw (BeanCreationException) ex;
}
else {
throw new BeanCreationException();
}
}
/***
* 是否需要提前暴露 earlySingletonExposure = true
* 判断条件:
* 1.是单例
* 2.允许循环依赖
* 3.bean正在被创建
*/
if (earlySingletonExposure) {
//从1级缓存和2级缓存获取
//因为allowEarlyReference=false 所以不会从3级缓存获取
//如果没有循环依赖 这里返回的是空
//虽然A会被加入3级缓存,但是并没有从3级缓存中取 也没有放入二级缓存
//最终会直接返回 exposedObject;
//然后放入1即缓存
//如果有循环依赖 A 和 B 循环依赖
// 对于A来说
// 1.A在创建完实例后会被阻塞在填充属性的方法栈populateBean。
// 2.在B填充属性A对象时,会在填充属性方法中调用getSingleton(beanName,true);
// 3.会把从3级缓存取出A的ObjectFactory并调用getObject方法获取A对象
// 4.其实调用的就是A对应的getEarlyBeanReference方法
// 5.因为allowEarlyReference是true 所以会到三级缓存拿 并放入二级缓存
// 6.当B实例化完成后,A继续往下走
// 然后在这里获取的就是A在二级缓存中的对象
// 最后判断代理的对象和提前暴露的对象是不是还是一个
Object earlySingletonReference = getSingleton(beanName, false);
if (earlySingletonReference != null) {
if (exposedObject == bean) {
//判断代理的对象和提前暴露的对象是不是还是一个
exposedObject = earlySingletonReference;
//如果不是一个判断是否有依赖该bean的对象
}else if (!this.allowRawInjectionDespiteWrapping
&& hasDependentBean(beanName)) {
String[] dependentBeans = getDependentBeans(beanName);
Set<String> actualDependentBeans =
new LinkedHashSet<>(dependentBeans.length);
for (String dependentBean : dependentBeans) {
if (!removeSingletonIfCreatedForTypeCheckOnly
(dependentBean)) {
actualDependentBeans.add(dependentBean);
}
}
if (!actualDependentBeans.isEmpty()) {
throw new BeanCurrentlyInCreationException();
}
}
}
}
try {
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException();
}
return exposedObject;
}
protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
Assert.notNull(singletonFactory, "Singleton factory must not be null");
synchronized (this.singletonObjects) {
if (!this.singletonObjects.containsKey(beanName)) {
/***
* 加入三级缓存
*/
this.singletonFactories.put(beanName, singletonFactory);
/***
* 从2级缓存移除
*/
this.earlySingletonObjects.remove(beanName);
/****
* 将beanName加入已注册实例
*/
this.registeredSingletons.add(beanName);
}
}
}
//bean是早期暴露的引用
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
Object exposedObject = bean;
//1.不是合成的
//2.存在InstantiationAwareBeanPostProcessor
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
//org.springframework.aop.framework.autoproxy.
//AbstractAutoProxyCreator.getEarlyBeanReference
SmartInstantiationAwareBeanPostProcessor
ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
exposedObject
= ibp.getEarlyBeanReference(exposedObject, beanName);
}
}
}
return exposedObject;
1.选择构造方法,创建实例bean
2.() -> getEarlyBeanReference(beanName, mbd, bean)加入三级缓存,这里也是ObjectFactory的一个匿名实现类。其中getEarlyBeanReference(beanName, mbd, bean)中已经将创建好的提前暴露的对象bean传递给了getEarlyBeanReference方法中作为参数。
3.填充属性
4.初始化并生成代理对象
5.没有循环依赖,从1 2 级缓存中获取bean,获取不到,返回的是一个空
//没有循环依赖
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
// 是否应创建早期引用 allowEarlyReference is false
// 一级缓存中该bean为空
Object singletonObject = this.singletonObjects.get(beanName);
//singletonObject 且 当前 bean 正在创建才能去2级缓存拿
//2级缓存中该bean也是空
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
singletonObject = this.earlySingletonObjects.get(beanName);
}
return singletonObject;
}
//这里有循环依赖和没有循环依赖稍微不同。
//如果没有循环依赖 从1级缓存和2级缓存返回的都是空
//虽然A会被加入3级缓存,但是并没有从3级缓存中取 也没有放入二级缓存
//虽然放入了三级缓存,但是不会调用A的ObjectFactory方法。
//也就是说在二级缓存中A是没有的。也不会去二级缓存拿。
//最终会直接返回 exposedObject;
//然后放入1即缓存
//如果有循环依赖 A 和 B 循环依赖
// 对于A来说
// 1.A在创建完实例后会被阻塞在填充属性的方法栈populateBean。
// 2.在B填充属性A对象时,会在填充属性方法中调用getSingleton(beanName,true);
// 3.会把从3级缓存取出A的ObjectFactory并调用getObject方法获取A对象
// 4.其实调用的就是A对应的getEarlyBeanReference方法
// 5.因为allowEarlyReference是true 所以会到三级缓存拿 并放入二级缓存
// 6.当B实例化完成后,A继续往下走
// 然后在这里获取的就是A在二级缓存中的对象
// 最后判断代理的对象和提前暴露的对象是不是还是一个
感觉这里和有循环依赖稍微不同。这里只创建A。虽然放入了三级缓存,但是不会调用A的ObjectFactory方法也就是说在二级缓存中A是没有的。也不会去二级缓存拿。
如果是循环依赖,B在填充属性时会将A在三级缓存中的ObjectFactory拿出来调用获取一个半成品。放入二级缓存。
//有循环依赖
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
//是否应创建早期引用 allowEarlyReference is false
//一级缓存中该bean为空
Object singletonObject = this.singletonObjects.get(beanName);
//singletonObject 且 当前 bean 正在创建才能去2级缓存拿
//2级缓存中该bean不是空
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
singletonObject = this.earlySingletonObjects.get(beanName);
}
return singletonObject;
}
6.判断二级缓存中对象是不是不等于null。
7.如果不是null 那么判断代理的对象和提前暴露的对象是不是还是一个
8.如果不是一个就报错,在判断是否有其他的bean依赖A,如果有那么报错
9.最后将正在创建中的状态修改掉,放入一级缓存。
5.10finishRefresh
protected void finishRefresh() {
clearResourceCaches();
initLifecycleProcessor();
// Propagate refresh to lifecycle processor first.
getLifecycleProcessor().onRefresh();
// Publish the final event.
publishEvent(new ContextRefreshedEvent(this));
// Participate in LiveBeansView MBean, if active.
LiveBeansView.registerApplicationContext(this);
}
initLifecycleProcessor
protected void initLifecycleProcessor() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {
this.lifecycleProcessor =
beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);
if (logger.isTraceEnabled()) {
logger.trace("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");
}
}
else {
DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
defaultProcessor.setBeanFactory(beanFactory);
this.lifecycleProcessor = defaultProcessor;
beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
}
}
可以看到,在方法initLifecycleProcessor中,首先就是到Spring容器中看下是否存在名称为lifecycleProcessor的bean。
如果存在的话,直接从Spring容器中获取出来,并赋值给成员变量lifecycleProcessor,如果不存在的话默认会创建一个DefaultLifecycleProcessor类型的对象,并赋值给成员变量lifecycleProcessor,最后再注入到Spring容器中,那DefaultLifecycleProcessor又是什么呢?
其实DefaultLifecycleProcessor是Spring中,处理Spring生命周期相关的一个组件,Spring提供生命周期的接口Lifecycle。
可以看到,DefaultLifecycleProcessor最终也是实现接口Lifecycle的,而LifecycleProcessor接口也只不过是Lifecycle接口的一个扩展接口而已,我们可以看下这两个接口中的方法:
在Spring中如果bean实现了接口Lifecycle,Spring会保证在容器启动时,就会调用这些bean中的start方法开启它们的生命周期,当然,在Spring关闭的时候也会调用stop方法来结束它们的生命周期。
而LifecycleProcessor在Lifecycle的基础上,又添加了两个方法onRefresh和onClose,主要就是对相应的bean做状态更新,关于onRefresh方法的逻辑,我们可以来看下。
可以看到,接下来会调用LifecycleProcessor中的onRefresh方法,我们到onRefresh方法中看下:
@Override
public void onRefresh() {
startBeans(true);
this.running = true;
}
private void startBeans(boolean autoStartupOnly) {
Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans();
Map<Integer, LifecycleGroup> phases = new HashMap<>();
lifecycleBeans.forEach((beanName, bean) -> {
if (!autoStartupOnly ||
(bean instanceof SmartLifecycle
&& ((SmartLifecycle) bean).isAutoStartup())) {
int phase = getPhase(bean);
LifecycleGroup group = phases.get(phase);
if (group == null) {
group = new LifecycleGroup
(phase, this.timeoutPerShutdownPhase,
lifecycleBeans, autoStartupOnly);
phases.put(phase, group);
}
group.add(beanName, bean);
}
});
if (!phases.isEmpty()) {
List<Integer> keys = new ArrayList<>(phases.keySet());
Collections.sort(keys);
for (Integer key : keys) {
phases.get(key).start();
}
}
}
可以看到在onRefresh方法中,像我们刚才分析的一样,就会从Spring容器中获取所有实现了Lifecycle接口的bean,然后调用start方法来开启它们的生命周期,也就是开启Spring的生命周期了。
publishEvent
publishEvent(new ContextRefreshedEvent(this));
可以看到,其实就是发布了一个刷新上下文的事件ContextRefreshedEvent。
根据我们前面的源码分析,事件ContextRefreshedEvent将会注册到广播器中,广播器会把该事件广播器相应的监听器去处理,这个事件相当于告诉Spring整个容器已经刷新了,也就说Spring容器ApplicationContext已经初始化完毕了。
applyMergedBeanDefinitionPostProcessor
调用 MergedBeanDefinitionPostProcessor查找出满足条件的属性、方法, 将他们封装起来, 以便后面在填充属性的时候可以直接使用