暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
Spring.pdf
106
15页
0次
2023-04-28
100墨值下载
⼀、前⾔
Spring Bean 的⽣命周期⼀直都是个⾼频⾯试题,丙丙基本上⾯哪⾥也都会被问到,⼤家是不是可能
都是很简单的回答, 就好了?
讲道理以前我也是这么认为的,但是后⾯我看了spring的源码之后(绝对是所有源码⾥⾯最难看懂的)
发现没那么简单,⽽且上⾯的回答,基本上在⼤⼚的⾯试⾥⾯都是GG
本⽂就来结合源码来分析 Bean 的实例化和初始化两个阶段,并引出相关的拓展点。
⼆、bean的创建
DefaultListableBeanFactory 的抽象⽗类 AbstractAutowireCapableBeanFactory 完成了 Bean 的实例化
和初始化。
protected Object createBean(String beanName, RootBeanDefinition mbd,
@Nullable Object[] args){
RootBeanDefinition mbdToUse = mbd;
// 1-类加载校验
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() &&
mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// 2-⽅法覆盖校验和准备
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new
BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
// 3-如果 Bean 配置了实例化的前置处理器,则返回对应的代理对象
try {
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
代码块前两步⼲的事情我已经注释在代码上了,这块不是本⽂的主线,直接来看上⾯代码块中的第三
步,实例化的前置处理。
1.实例化前置处理
我们发现当调⽤ resolveBeforeInstantiation ⽅法返回⾮空时,会直接使⽤返回的实例化 Bean ,不再进⾏
后续流程。否则,继续使⽤容器的实例化,我们来看它的代码。
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(),
beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
// 4-创建 Bean 的关键⽅法
try {
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isTraceEnabled()) {
logger.trace("Finished creating instance of bean '" + beanName +
"'");
}
return beanInstance;
}
catch (Throwable ex) {
throw new BeanCreationException(
mbdToUse.getResourceDescription(), beanName, "Unexpected
exception during bean creation", ex);
}
}
protected Object resolveBeforeInstantiation(String beanName,
RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors())
{
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
// 执⾏实例化前置处理器的 postProcessBeforeInstantiation ⽅法
bean = applyBeanPostProcessorsBeforeInstantiation(targetType,
beanName);
if (bean != null) {
// 如有返回对象,执⾏初始化后置处理器的 postProcessAfterInstantiation
⽅法,完善创建流程
of 15
100墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜