没什么可说的,首先给出结论。本文只讨论了该类别的执行关系。
Bean的特定实例化过程太复杂了,对理解建议感兴趣,请参阅“深度分析中的春季源代码”一书。
示例代码删除日志,有些与分析无关
由于代码太多,因此只挑选了关键代码。如果您有兴趣,可以根据文章调试来理解该过程。
然后输入
输入getingleton()方法后,我发现里面有一些准备。真正的电话是lambda表达
输入lambda表达
受保护的对象initializeBean(strim beanname,对象bean,@nullable rootbeandefinition mbd){
if(system.getSecurityManager()!= null){
AccessController.doprivileged(privilegedAction
InvokeAwareMethods(beanname,bean);
返回null;
},getAccessControlContext());
}
别的 {
//处理意识接口,设置beanname或工厂
InvokeAwareMethods(beanname,bean);
}
对象包裹= bean;
if(mbd == null ||!mbd.issynthetic(){){){){){){){){){){){){){){){){){){)
//位置9
包裹bean = applyBeanPostProcessorsBeforinItialization(包装Bean,beanname);
}
尝试 {
InvoKeinitMethods(BeanName,包装Bean,MBD);
}
捕获(可投掷EX){
扔新的beanCreationException(
(mbd!= null?mbd.getResourcedEscript():null),null),
BeanName,“ Init方法的调用失败”,例如);
}
if(mbd == null ||!mbd.issynthetic(){){){){){){){){){){){){){){){){){){)
//第10号
包裹= applyBeanPostProcessorSafterInilition(包装Bean,BeanName);
}
返回包装;
}
//春季初始化扩展方法
受保护的void InvoKeinitMethods(弦豆名称,对象bean,@nullable rootbeandefinition MBD)
抛出可投掷{
boolean isInitializeBean =(bean instance of InitializatizBean);
if(isInitializingBean &&(mbd == null ||!mbd.isexternallyManagedInitMethod(“ afterPropertiestEst”){){){){){){){){){){
if(loger.istraceNabled()){{{
logger.trace(“在bean上使用名称'“ + beanname +”''“”的bean上的afterPropertiest();
}
if(system.getSecurityManager()!= null){
尝试 {
AccessController.doprivileged(privilegedExceptionActionAction
(初始化bean).fterPropertiesset();
返回null;
},getAccessControlContext());
}
catch(priviledactionAction exception pae){
扔pae.getException();
}
}
别的 {
(初始化bean).fterPropertiesset();
}
}
if(mbd!= null && bean.getClass()!= nullbean.class){
字符串initmarthodname = mbd.getInitmethodname();
if(stringutils.haslength(initmethodname)&& &&
呢(isInitializingBean &&“ afterPropertiesset” .equals(initmarthodname)&& && &&华氏
mbd.isexternallyManaticDintified(IntuiellyName)){{{
InvokeCustomInitMethod(BeanName,Bean,MBD);
}
}
}