Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
e213561d
S
spring-framework
项目概览
爱吃血肠
/
spring-framework
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
spring-framework
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
e213561d
编写于
9月 14, 2013
作者:
J
Juergen Hoeller
提交者:
unknown
9月 14, 2013
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
AbstractBeanFactory removes alreadyCreated entry after bean creation failure
Issue: SPR-10896
上级
0ee910c6
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
73 addition
and
59 deletion
+73
-59
spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
...gframework/beans/factory/support/AbstractBeanFactory.java
+73
-59
未找到文件。
spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
浏览文件 @
e213561d
...
...
@@ -278,79 +278,85 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
markBeanAsCreated
(
beanName
);
}
final
RootBeanDefinition
mbd
=
getMergedLocalBeanDefinition
(
beanName
);
checkMergedBeanDefinition
(
mbd
,
beanName
,
args
);
// Guarantee initialization of beans that the current bean depends on.
String
[]
dependsOn
=
mbd
.
getDependsOn
();
if
(
dependsOn
!=
null
)
{
for
(
String
dependsOnBean
:
dependsOn
)
{
getBean
(
dependsOnBean
);
registerDependentBean
(
dependsOnBean
,
beanName
);
}
}
// Create bean instance.
if
(
mbd
.
isSingleton
())
{
sharedInstance
=
getSingleton
(
beanName
,
new
ObjectFactory
<
Object
>()
{
@Override
public
Object
getObject
()
throws
BeansException
{
try
{
return
createBean
(
beanName
,
mbd
,
args
);
}
catch
(
BeansException
ex
)
{
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton
(
beanName
);
throw
ex
;
}
try
{
final
RootBeanDefinition
mbd
=
getMergedLocalBeanDefinition
(
beanName
);
checkMergedBeanDefinition
(
mbd
,
beanName
,
args
);
// Guarantee initialization of beans that the current bean depends on.
String
[]
dependsOn
=
mbd
.
getDependsOn
();
if
(
dependsOn
!=
null
)
{
for
(
String
dependsOnBean
:
dependsOn
)
{
getBean
(
dependsOnBean
);
registerDependentBean
(
dependsOnBean
,
beanName
);
}
});
bean
=
getObjectForBeanInstance
(
sharedInstance
,
name
,
beanName
,
mbd
);
}
else
if
(
mbd
.
isPrototype
())
{
// It's a prototype -> create a new instance.
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
();
final
Scope
scope
=
this
.
scopes
.
get
(
scopeName
);
if
(
scope
==
null
)
{
throw
new
IllegalStateException
(
"No Scope registered for scope '"
+
scopeName
+
"'"
);
}
try
{
Object
scopedInstance
=
scope
.
get
(
beanName
,
new
ObjectFactory
<
Object
>()
{
// Create bean instance.
if
(
mbd
.
isSingleton
())
{
sharedInstance
=
getSingleton
(
beanName
,
new
ObjectFactory
<
Object
>()
{
@Override
public
Object
getObject
()
throws
BeansException
{
beforePrototypeCreation
(
beanName
);
try
{
return
createBean
(
beanName
,
mbd
,
args
);
}
finally
{
afterPrototypeCreation
(
beanName
);
catch
(
BeansException
ex
)
{
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton
(
beanName
);
throw
ex
;
}
}
});
bean
=
getObjectForBeanInstance
(
s
cop
edInstance
,
name
,
beanName
,
mbd
);
bean
=
getObjectForBeanInstance
(
s
har
edInstance
,
name
,
beanName
,
mbd
);
}
catch
(
IllegalStateException
ex
)
{
throw
new
BeanCreationException
(
beanName
,
"Scope '"
+
scopeName
+
"' is not active for the current thread; "
+
"consider defining a scoped proxy for this bean if you intend to refer to it from a singleton"
,
ex
);
else
if
(
mbd
.
isPrototype
())
{
// It's a prototype -> create a new instance.
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
();
final
Scope
scope
=
this
.
scopes
.
get
(
scopeName
);
if
(
scope
==
null
)
{
throw
new
IllegalStateException
(
"No Scope registered for scope '"
+
scopeName
+
"'"
);
}
try
{
Object
scopedInstance
=
scope
.
get
(
beanName
,
new
ObjectFactory
<
Object
>()
{
@Override
public
Object
getObject
()
throws
BeansException
{
beforePrototypeCreation
(
beanName
);
try
{
return
createBean
(
beanName
,
mbd
,
args
);
}
finally
{
afterPrototypeCreation
(
beanName
);
}
}
});
bean
=
getObjectForBeanInstance
(
scopedInstance
,
name
,
beanName
,
mbd
);
}
catch
(
IllegalStateException
ex
)
{
throw
new
BeanCreationException
(
beanName
,
"Scope '"
+
scopeName
+
"' is not active for the current thread; "
+
"consider defining a scoped proxy for this bean if you intend to refer to it from a singleton"
,
ex
);
}
}
}
catch
(
BeansException
ex
)
{
cleanupAfterBeanCreationFailure
(
beanName
);
throw
ex
;
}
}
// Check if required type matches the type of the actual bean instance.
...
...
@@ -1430,6 +1436,14 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
this
.
alreadyCreated
.
add
(
beanName
);
}
/**
* Perform appropriate cleanup of cached metadata after bean creation failed.
* @param beanName the name of the bean
*/
protected
void
cleanupAfterBeanCreationFailure
(
String
beanName
)
{
this
.
alreadyCreated
.
remove
(
beanName
);
}
/**
* Determine whether the specified bean is eligible for having
* its bean definition metadata cached.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录