Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
bd846999
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,发现更多精彩内容 >>
提交
bd846999
编写于
12月 02, 2013
作者:
J
Juergen Hoeller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Detect depends-on cycles and throw proper exception
Issue: SPR-7966
上级
de890fd1
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
76 addition
and
6 deletion
+76
-6
spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
...gframework/beans/factory/support/AbstractBeanFactory.java
+5
-1
spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java
...k/beans/factory/support/DefaultSingletonBeanRegistry.java
+22
-0
spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
...mework/beans/factory/DefaultListableBeanFactoryTests.java
+49
-5
未找到文件。
spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
浏览文件 @
bd846999
...
...
@@ -286,8 +286,12 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
String
[]
dependsOn
=
mbd
.
getDependsOn
();
if
(
dependsOn
!=
null
)
{
for
(
String
dependsOnBean
:
dependsOn
)
{
getBean
(
dependsOnBean
);
if
(
isDependent
(
beanName
,
dependsOnBean
))
{
throw
new
BeanCreationException
(
"Circular depends-on relationship between '"
+
beanName
+
"' and '"
+
dependsOnBean
+
"'"
);
}
registerDependentBean
(
dependsOnBean
,
beanName
);
getBean
(
dependsOnBean
);
}
}
...
...
spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java
浏览文件 @
bd846999
...
...
@@ -412,6 +412,28 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
}
}
/**
* Determine whether the specified dependent bean has been registered as
* dependent on the given bean or on any of its transitive dependencies.
* @param beanName the name of the bean to check
* @param dependentBeanName the name of the dependent bean
*/
protected
boolean
isDependent
(
String
beanName
,
String
dependentBeanName
)
{
Set
<
String
>
dependentBeans
=
this
.
dependentBeanMap
.
get
(
beanName
);
if
(
dependentBeans
==
null
)
{
return
false
;
}
if
(
dependentBeans
.
contains
(
dependentBeanName
))
{
return
true
;
}
for
(
String
transitiveDependency
:
dependentBeans
)
{
if
(
isDependent
(
transitiveDependency
,
dependentBeanName
))
{
return
true
;
}
}
return
false
;
}
/**
* Determine whether a dependent bean has been registered for the given name.
* @param beanName the name of the bean to check
...
...
spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
浏览文件 @
bd846999
...
...
@@ -1219,8 +1219,8 @@ public class DefaultListableBeanFactoryTests {
}
catch
(
UnsatisfiedDependencyException
ex
)
{
// expected
assertTrue
(
ex
.
getMessage
().
indexOf
(
"rod"
)
!=
-
1
);
assertTrue
(
ex
.
getMessage
().
indexOf
(
"rod2"
)
!=
-
1
);
assertTrue
(
ex
.
getMessage
().
contains
(
"rod"
)
);
assertTrue
(
ex
.
getMessage
().
contains
(
"rod2"
)
);
}
}
...
...
@@ -1290,6 +1290,51 @@ public class DefaultListableBeanFactoryTests {
assertNull
(
bean
.
getSpouse
());
}
@Test
public
void
testDependsOnCycle
()
{
DefaultListableBeanFactory
lbf
=
new
DefaultListableBeanFactory
();
RootBeanDefinition
bd1
=
new
RootBeanDefinition
(
TestBean
.
class
);
bd1
.
setDependsOn
(
new
String
[]
{
"tb2"
});
lbf
.
registerBeanDefinition
(
"tb1"
,
bd1
);
RootBeanDefinition
bd2
=
new
RootBeanDefinition
(
TestBean
.
class
);
bd2
.
setDependsOn
(
new
String
[]
{
"tb1"
});
lbf
.
registerBeanDefinition
(
"tb2"
,
bd2
);
try
{
lbf
.
preInstantiateSingletons
();
fail
(
"Should have thrown BeanCreationException"
);
}
catch
(
BeanCreationException
ex
)
{
// expected
assertTrue
(
ex
.
getMessage
().
contains
(
"Circular"
));
assertTrue
(
ex
.
getMessage
().
contains
(
"'tb2'"
));
assertTrue
(
ex
.
getMessage
().
contains
(
"'tb1'"
));
}
}
@Test
public
void
testImplicitDependsOnCycle
()
{
DefaultListableBeanFactory
lbf
=
new
DefaultListableBeanFactory
();
RootBeanDefinition
bd1
=
new
RootBeanDefinition
(
TestBean
.
class
);
bd1
.
setDependsOn
(
new
String
[]
{
"tb2"
});
lbf
.
registerBeanDefinition
(
"tb1"
,
bd1
);
RootBeanDefinition
bd2
=
new
RootBeanDefinition
(
TestBean
.
class
);
bd2
.
setDependsOn
(
new
String
[]
{
"tb3"
});
lbf
.
registerBeanDefinition
(
"tb2"
,
bd2
);
RootBeanDefinition
bd3
=
new
RootBeanDefinition
(
TestBean
.
class
);
bd3
.
setDependsOn
(
new
String
[]
{
"tb1"
});
lbf
.
registerBeanDefinition
(
"tb3"
,
bd3
);
try
{
lbf
.
preInstantiateSingletons
();
fail
(
"Should have thrown BeanCreationException"
);
}
catch
(
BeanCreationException
ex
)
{
// expected
assertTrue
(
ex
.
getMessage
().
contains
(
"Circular"
));
assertTrue
(
ex
.
getMessage
().
contains
(
"'tb3'"
));
assertTrue
(
ex
.
getMessage
().
contains
(
"'tb1'"
));
}
}
@Test
(
expected
=
NoSuchBeanDefinitionException
.
class
)
public
void
testGetBeanByTypeWithNoneFound
()
{
DefaultListableBeanFactory
lbf
=
new
DefaultListableBeanFactory
();
...
...
@@ -2174,7 +2219,7 @@ public class DefaultListableBeanFactoryTests {
AbstractBeanDefinition
beanDefinition
=
builder
.
getBeanDefinition
();
beanDefinition
.
setScope
(
"he put himself so low could hardly look me in the face"
);
final
DefaultListableBeanFactory
factory
=
new
DefaultListableBeanFactory
();
DefaultListableBeanFactory
factory
=
new
DefaultListableBeanFactory
();
factory
.
registerBeanDefinition
(
"testBean"
,
beanDefinition
);
factory
.
getBean
(
"testBean"
);
}
...
...
@@ -2186,8 +2231,7 @@ public class DefaultListableBeanFactoryTests {
RootBeanDefinition
parent
=
new
RootBeanDefinition
();
parent
.
setScope
(
RootBeanDefinition
.
SCOPE_PROTOTYPE
);
AbstractBeanDefinition
child
=
BeanDefinitionBuilder
.
childBeanDefinition
(
"parent"
).
getBeanDefinition
();
AbstractBeanDefinition
child
=
BeanDefinitionBuilder
.
childBeanDefinition
(
"parent"
).
getBeanDefinition
();
child
.
setBeanClass
(
TestBean
.
class
);
child
.
setScope
(
theChildScope
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录