Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
890819f8
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,发现更多精彩内容 >>
提交
890819f8
编写于
2月 19, 2016
作者:
J
Juergen Hoeller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
SmartObjectFactory provides getObject(args) variant as well
Issue: SPR-13956
上级
5ed90468
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
81 addition
and
10 deletion
+81
-10
spring-beans/src/main/java/org/springframework/beans/factory/SmartObjectFactory.java
...org/springframework/beans/factory/SmartObjectFactory.java
+16
-4
spring-beans/src/main/java/org/springframework/beans/factory/config/DependencyDescriptor.java
...gframework/beans/factory/config/DependencyDescriptor.java
+15
-0
spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
...ork/beans/factory/support/DefaultListableBeanFactory.java
+26
-5
spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java
...annotation/AutowiredAnnotationBeanPostProcessorTests.java
+24
-1
未找到文件。
spring-beans/src/main/java/org/springframework/beans/factory/SmartObjectFactory.java
浏览文件 @
890819f8
...
...
@@ -28,8 +28,20 @@ import org.springframework.beans.BeansException;
public
interface
SmartObjectFactory
<
T
>
extends
ObjectFactory
<
T
>
{
/**
* Return an instance (possibly shared or independent)
* of the object managed by this factory.
* Return an instance (possibly shared or independent) of the object
* managed by this factory.
* <p>Allows for specifying explicit construction arguments, along the
* lines of {@link BeanFactory#getBean(String, Object...)}.
* @param args arguments to use when creating a corresponding instance
* @return an instance of the bean
* @throws BeansException in case of creation errors
* @see #getObject()
*/
T
getObject
(
Object
...
args
)
throws
BeansException
;
/**
* Return an instance (possibly shared or independent) of the object
* managed by this factory.
* @return an instance of the bean, or {@code null} if not available
* @throws BeansException in case of creation errors
* @see #getObject()
...
...
@@ -37,8 +49,8 @@ public interface SmartObjectFactory<T> extends ObjectFactory<T> {
T
getIfAvailable
()
throws
BeansException
;
/**
* Return an instance (possibly shared or independent)
*
of the object
managed by this factory.
* Return an instance (possibly shared or independent)
of the object
* managed by this factory.
* @return an instance of the bean, or {@code null} if not available or
* not unique (i.e. multiple candidates found with none marked as primary)
* @throws BeansException in case of creation errors
...
...
spring-beans/src/main/java/org/springframework/beans/factory/config/DependencyDescriptor.java
浏览文件 @
890819f8
...
...
@@ -26,6 +26,7 @@ import java.lang.reflect.Type;
import
java.util.Map
;
import
org.springframework.beans.BeansException
;
import
org.springframework.beans.factory.BeanFactory
;
import
org.springframework.beans.factory.NoUniqueBeanDefinitionException
;
import
org.springframework.core.GenericCollectionTypeResolver
;
import
org.springframework.core.GenericTypeResolver
;
...
...
@@ -200,6 +201,20 @@ public class DependencyDescriptor implements Serializable {
throw
new
NoUniqueBeanDefinitionException
(
type
,
matchingBeans
.
keySet
());
}
/**
* Resolve the specified bean name, as a candidate result of the matching
* algorithm for this dependency, to a bean instance from the given factory.
* <p>The default implementation calls {@link BeanFactory#getBean(String)}.
* Subclasses may provide additional arguments or other customizations.
* @param beanName the bean name, as a candidate result for this dependency
* @param beanFactory the associated factory
* @return the bean instance (never {@code null})
* @see BeanFactory#getBean(String)
*/
public
Object
resolveCandidate
(
String
beanName
,
BeanFactory
beanFactory
)
{
return
beanFactory
.
getBean
(
beanName
);
}
/**
* Increase this descriptor's nesting level.
...
...
spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
浏览文件 @
890819f8
...
...
@@ -1052,7 +1052,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
if
(
matchingBeans
.
size
()
>
1
)
{
String
primaryBeanName
=
determineAutowireCandidate
(
matchingBeans
,
descriptor
);
if
(
primaryBeanName
==
null
)
{
if
(
!
indicatesMultipleBeans
(
type
)
||
descriptor
.
isRequired
(
))
{
if
(
descriptor
.
isRequired
()
||
!
indicatesMultipleBeans
(
type
))
{
return
descriptor
.
resolveNotUnique
(
type
,
matchingBeans
);
}
else
{
...
...
@@ -1198,7 +1198,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
}
for
(
String
candidateName
:
candidateNames
)
{
if
(!
isSelfReference
(
beanName
,
candidateName
)
&&
isAutowireCandidate
(
candidateName
,
descriptor
))
{
result
.
put
(
candidateName
,
getBean
(
candidateName
));
result
.
put
(
candidateName
,
descriptor
.
resolveCandidate
(
candidateName
,
this
));
}
}
if
(
result
.
isEmpty
()
&&
!
indicatesMultipleBeans
(
requiredType
))
{
...
...
@@ -1206,14 +1206,14 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
DependencyDescriptor
fallbackDescriptor
=
descriptor
.
forFallbackMatch
();
for
(
String
candidateName
:
candidateNames
)
{
if
(!
isSelfReference
(
beanName
,
candidateName
)
&&
isAutowireCandidate
(
candidateName
,
fallbackDescriptor
))
{
result
.
put
(
candidateName
,
getBean
(
candidateName
));
result
.
put
(
candidateName
,
descriptor
.
resolveCandidate
(
candidateName
,
this
));
}
}
if
(
result
.
isEmpty
())
{
// Consider self references before as a final pass
for
(
String
candidateName
:
candidateNames
)
{
if
(
isSelfReference
(
beanName
,
candidateName
)
&&
isAutowireCandidate
(
candidateName
,
fallbackDescriptor
))
{
result
.
put
(
candidateName
,
getBean
(
candidateName
));
result
.
put
(
candidateName
,
descriptor
.
resolveCandidate
(
candidateName
,
this
));
}
}
}
...
...
@@ -1462,12 +1462,17 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
@UsesJava8
private
class
OptionalDependencyFactory
{
public
Object
createOptionalDependency
(
DependencyDescriptor
descriptor
,
String
beanName
)
{
public
Object
createOptionalDependency
(
DependencyDescriptor
descriptor
,
String
beanName
,
final
Object
...
args
)
{
DependencyDescriptor
descriptorToUse
=
new
DependencyDescriptor
(
descriptor
)
{
@Override
public
boolean
isRequired
()
{
return
false
;
}
@Override
public
Object
resolveCandidate
(
String
beanName
,
BeanFactory
beanFactory
)
{
return
(!
ObjectUtils
.
isEmpty
(
args
)
?
beanFactory
.
getBean
(
beanName
,
args
)
:
super
.
resolveCandidate
(
beanName
,
beanFactory
));
}
};
descriptorToUse
.
increaseNestingLevel
();
return
Optional
.
ofNullable
(
doResolveDependency
(
descriptorToUse
,
beanName
,
null
,
null
));
...
...
@@ -1503,6 +1508,22 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
}
}
@Override
public
Object
getObject
(
final
Object
...
args
)
throws
BeansException
{
if
(
this
.
optional
)
{
return
new
OptionalDependencyFactory
().
createOptionalDependency
(
this
.
descriptor
,
this
.
beanName
,
args
);
}
else
{
DependencyDescriptor
descriptorToUse
=
new
DependencyDescriptor
(
descriptor
)
{
@Override
public
Object
resolveCandidate
(
String
beanName
,
BeanFactory
beanFactory
)
{
return
beanFactory
.
getBean
(
beanName
,
args
);
}
};
return
doResolveDependency
(
descriptorToUse
,
this
.
beanName
,
null
,
null
);
}
}
@Override
public
Object
getIfAvailable
()
throws
BeansException
{
if
(
this
.
optional
)
{
...
...
spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java
浏览文件 @
890819f8
...
...
@@ -1047,7 +1047,26 @@ public class AutowiredAnnotationBeanPostProcessorTests {
}
@Test
public
void
testSmartObjectFactoryInjection
()
{
public
void
testSmartObjectFactoryInjectionWithPrototype
()
{
DefaultListableBeanFactory
bf
=
new
DefaultListableBeanFactory
();
AutowiredAnnotationBeanPostProcessor
bpp
=
new
AutowiredAnnotationBeanPostProcessor
();
bpp
.
setBeanFactory
(
bf
);
bf
.
addBeanPostProcessor
(
bpp
);
bf
.
registerBeanDefinition
(
"annotatedBean"
,
new
RootBeanDefinition
(
SmartObjectFactoryInjectionBean
.
class
));
RootBeanDefinition
tbd
=
new
RootBeanDefinition
(
TestBean
.
class
);
tbd
.
setScope
(
RootBeanDefinition
.
SCOPE_PROTOTYPE
);
bf
.
registerBeanDefinition
(
"testBean"
,
tbd
);
SmartObjectFactoryInjectionBean
bean
=
(
SmartObjectFactoryInjectionBean
)
bf
.
getBean
(
"annotatedBean"
);
assertEquals
(
bf
.
getBean
(
"testBean"
),
bean
.
getTestBean
());
assertEquals
(
bf
.
getBean
(
"testBean"
,
"myName"
),
bean
.
getTestBean
(
"myName"
));
assertEquals
(
bf
.
getBean
(
"testBean"
),
bean
.
getOptionalTestBean
());
assertEquals
(
bf
.
getBean
(
"testBean"
),
bean
.
getUniqueTestBean
());
bf
.
destroySingletons
();
}
@Test
public
void
testSmartObjectFactoryInjectionWithSingletonTarget
()
{
DefaultListableBeanFactory
bf
=
new
DefaultListableBeanFactory
();
AutowiredAnnotationBeanPostProcessor
bpp
=
new
AutowiredAnnotationBeanPostProcessor
();
bpp
.
setBeanFactory
(
bf
);
...
...
@@ -2557,6 +2576,10 @@ public class AutowiredAnnotationBeanPostProcessorTests {
return
this
.
testBeanFactory
.
getObject
();
}
public
TestBean
getTestBean
(
String
name
)
{
return
this
.
testBeanFactory
.
getObject
(
name
);
}
public
TestBean
getOptionalTestBean
()
{
return
this
.
testBeanFactory
.
getIfAvailable
();
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录