Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
0a42c80c
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,发现更多精彩内容 >>
提交
0a42c80c
编写于
9月 10, 2012
作者:
J
Juergen Hoeller
提交者:
unknown
9月 10, 2012
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
@Import'ed configuration classes get properly registered in case of same class name (second try)
Issue: SPR-9243
上级
34c3e821
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
60 addition
and
55 deletion
+60
-55
spring-context/src/main/java/org/springframework/context/annotation/AnnotatedBeanDefinitionReader.java
...ork/context/annotation/AnnotatedBeanDefinitionReader.java
+7
-7
spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java
...ework/context/annotation/AnnotationBeanNameGenerator.java
+2
-12
spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java
...xt/annotation/ConfigurationClassBeanDefinitionReader.java
+8
-15
spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java
...ramework/context/annotation/ConfigurationClassParser.java
+3
-4
spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java
...k/context/annotation/ConfigurationClassPostProcessor.java
+40
-17
未找到文件。
spring-context/src/main/java/org/springframework/context/annotation/AnnotatedBeanDefinitionReader.java
浏览文件 @
0a42c80c
...
...
@@ -52,6 +52,7 @@ public class AnnotatedBeanDefinitionReader {
private
ScopeMetadataResolver
scopeMetadataResolver
=
new
AnnotationScopeMetadataResolver
();
/**
* Create a new {@code AnnotatedBeanDefinitionReader} for the given registry.
* If the registry is {@link EnvironmentCapable}, e.g. is an {@code ApplicationContext},
...
...
@@ -78,10 +79,8 @@ public class AnnotatedBeanDefinitionReader {
public
AnnotatedBeanDefinitionReader
(
BeanDefinitionRegistry
registry
,
Environment
environment
)
{
Assert
.
notNull
(
registry
,
"BeanDefinitionRegistry must not be null"
);
Assert
.
notNull
(
environment
,
"Environment must not be null"
);
this
.
registry
=
registry
;
this
.
environment
=
environment
;
AnnotationConfigUtils
.
registerAnnotationConfigProcessors
(
this
.
registry
);
}
...
...
@@ -115,8 +114,8 @@ public class AnnotatedBeanDefinitionReader {
* <p>The default is an {@link AnnotationScopeMetadataResolver}.
*/
public
void
setScopeMetadataResolver
(
ScopeMetadataResolver
scopeMetadataResolver
)
{
this
.
scopeMetadataResolver
=
(
scopeMetadataResolver
!=
null
?
scopeMetadataResolver
:
new
AnnotationScopeMetadataResolver
());
this
.
scopeMetadataResolver
=
(
scopeMetadataResolver
!=
null
?
scopeMetadataResolver
:
new
AnnotationScopeMetadataResolver
());
}
public
void
register
(
Class
<?>...
annotatedClasses
)
{
...
...
@@ -136,7 +135,6 @@ public class AnnotatedBeanDefinitionReader {
public
void
registerBean
(
Class
<?>
annotatedClass
,
String
name
,
Class
<?
extends
Annotation
>...
qualifiers
)
{
AnnotatedGenericBeanDefinition
abd
=
new
AnnotatedGenericBeanDefinition
(
annotatedClass
);
AnnotationMetadata
metadata
=
abd
.
getMetadata
();
if
(
metadata
.
isAnnotated
(
Profile
.
class
.
getName
()))
{
AnnotationAttributes
profile
=
MetadataUtils
.
attributesFor
(
metadata
,
Profile
.
class
);
if
(!
this
.
environment
.
acceptsProfiles
(
profile
.
getStringArray
(
"value"
)))
{
...
...
@@ -151,9 +149,11 @@ public class AnnotatedBeanDefinitionReader {
for
(
Class
<?
extends
Annotation
>
qualifier
:
qualifiers
)
{
if
(
Primary
.
class
.
equals
(
qualifier
))
{
abd
.
setPrimary
(
true
);
}
else
if
(
Lazy
.
class
.
equals
(
qualifier
))
{
}
else
if
(
Lazy
.
class
.
equals
(
qualifier
))
{
abd
.
setLazyInit
(
true
);
}
else
{
}
else
{
abd
.
addQualifier
(
new
AutowireCandidateQualifier
(
qualifier
));
}
}
...
...
spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java
浏览文件 @
0a42c80c
...
...
@@ -20,7 +20,6 @@ import java.beans.Introspector;
import
java.util.Map
;
import
java.util.Set
;
import
org.springframework.beans.factory.BeanFactoryUtils
;
import
org.springframework.beans.factory.annotation.AnnotatedBeanDefinition
;
import
org.springframework.beans.factory.config.BeanDefinition
;
import
org.springframework.beans.factory.support.BeanDefinitionRegistry
;
...
...
@@ -122,22 +121,13 @@ public class AnnotationBeanNameGenerator implements BeanNameGenerator {
/**
* Derive a default bean name from the given bean definition.
* <p>The default implementation delegates to {@link #buildDefaultBeanName(BeanDefinition)},
* appending a counter suffix if necessary to make the bean name unique in the given registry.
* <p>The default implementation delegates to {@link #buildDefaultBeanName(BeanDefinition)}.
* @param definition the bean definition to build a bean name for
* @param registry the registry that the given bean definition is being registered with
* @return the default bean name (never <code>null</code>)
*/
protected
String
buildDefaultBeanName
(
BeanDefinition
definition
,
BeanDefinitionRegistry
registry
)
{
String
generatedName
=
buildDefaultBeanName
(
definition
);
// Increase counter until the id is unique.
String
id
=
generatedName
;
int
counter
=
0
;
while
(
registry
.
containsBeanDefinition
(
id
))
{
counter
++;
id
=
generatedName
+
BeanFactoryUtils
.
GENERATED_BEAN_NAME_SEPARATOR
+
counter
;
}
return
id
;
return
buildDefaultBeanName
(
definition
);
}
/**
...
...
spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java
浏览文件 @
0a42c80c
...
...
@@ -49,7 +49,6 @@ import org.springframework.core.io.ResourceLoader;
import
org.springframework.core.type.AnnotationMetadata
;
import
org.springframework.core.type.MethodMetadata
;
import
org.springframework.core.type.classreading.MetadataReaderFactory
;
import
org.springframework.util.Assert
;
import
org.springframework.util.StringUtils
;
import
static
org
.
springframework
.
context
.
annotation
.
MetadataUtils
.*;
...
...
@@ -83,29 +82,25 @@ class ConfigurationClassBeanDefinitionReader {
private
final
Environment
environment
;
private
final
BeanNameGenerator
b
eanNameGenerator
;
private
final
BeanNameGenerator
importB
eanNameGenerator
;
/**
* Create a new {@link ConfigurationClassBeanDefinitionReader} instance that will be used
* to populate the given {@link BeanDefinitionRegistry}.
* @param problemReporter
* @param metadataReaderFactory
*/
public
ConfigurationClassBeanDefinitionReader
(
BeanDefinitionRegistry
registry
,
SourceExtractor
sourceExtractor
,
ProblemReporter
problemReporter
,
MetadataReaderFactory
metadataReaderFactory
,
ResourceLoader
resourceLoader
,
Environment
environment
,
BeanNameGenerator
beanNameGenerator
)
{
ResourceLoader
resourceLoader
,
Environment
environment
,
BeanNameGenerator
importBeanNameGenerator
)
{
Assert
.
notNull
(
beanNameGenerator
,
"BeanNameGenerator must not be null"
);
this
.
registry
=
registry
;
this
.
sourceExtractor
=
sourceExtractor
;
this
.
problemReporter
=
problemReporter
;
this
.
metadataReaderFactory
=
metadataReaderFactory
;
this
.
resourceLoader
=
resourceLoader
;
this
.
environment
=
environment
;
this
.
beanNameGenerator
=
b
eanNameGenerator
;
this
.
importBeanNameGenerator
=
importB
eanNameGenerator
;
}
...
...
@@ -124,7 +119,9 @@ class ConfigurationClassBeanDefinitionReader {
* class itself, all its {@link Bean} methods
*/
private
void
loadBeanDefinitionsForConfigurationClass
(
ConfigurationClass
configClass
)
{
doLoadBeanDefinitionForConfigurationClassIfNecessary
(
configClass
);
if
(
configClass
.
isImported
())
{
registerBeanDefinitionForImportedConfigurationClass
(
configClass
);
}
for
(
BeanMethod
beanMethod
:
configClass
.
getBeanMethods
())
{
loadBeanDefinitionsForBeanMethod
(
beanMethod
);
}
...
...
@@ -134,17 +131,13 @@ class ConfigurationClassBeanDefinitionReader {
/**
* Register the {@link Configuration} class itself as a bean definition.
*/
private
void
doLoadBeanDefinitionForConfigurationClassIfNecessary
(
ConfigurationClass
configClass
)
{
if
(!
configClass
.
isImported
())
{
return
;
}
private
void
registerBeanDefinitionForImportedConfigurationClass
(
ConfigurationClass
configClass
)
{
AnnotationMetadata
metadata
=
configClass
.
getMetadata
();
BeanDefinition
configBeanDef
=
new
AnnotatedGenericBeanDefinition
(
metadata
);
String
className
=
metadata
.
getClassName
();
configBeanDef
.
setBeanClassName
(
className
);
if
(
ConfigurationClassUtils
.
checkConfigurationClassCandidate
(
configBeanDef
,
this
.
metadataReaderFactory
))
{
String
configBeanName
=
this
.
b
eanNameGenerator
.
generateBeanName
(
configBeanDef
,
this
.
registry
);
String
configBeanName
=
this
.
importB
eanNameGenerator
.
generateBeanName
(
configBeanDef
,
this
.
registry
);
this
.
registry
.
registerBeanDefinition
(
configBeanName
,
configBeanDef
);
configClass
.
setBeanName
(
configBeanName
);
if
(
logger
.
isDebugEnabled
())
{
...
...
spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java
浏览文件 @
0a42c80c
...
...
@@ -101,9 +101,8 @@ class ConfigurationClassParser {
* to populate the set of configuration classes.
*/
public
ConfigurationClassParser
(
MetadataReaderFactory
metadataReaderFactory
,
ProblemReporter
problemReporter
,
Environment
environment
,
ResourceLoader
resourceLoader
,
BeanNameGenerator
beanNameGenerator
,
BeanDefinitionRegistry
registry
)
{
ProblemReporter
problemReporter
,
Environment
environment
,
ResourceLoader
resourceLoader
,
BeanNameGenerator
componentScanBeanNameGenerator
,
BeanDefinitionRegistry
registry
)
{
this
.
metadataReaderFactory
=
metadataReaderFactory
;
this
.
problemReporter
=
problemReporter
;
...
...
@@ -111,7 +110,7 @@ class ConfigurationClassParser {
this
.
resourceLoader
=
resourceLoader
;
this
.
registry
=
registry
;
this
.
componentScanParser
=
new
ComponentScanAnnotationParser
(
resourceLoader
,
environment
,
b
eanNameGenerator
,
registry
);
resourceLoader
,
environment
,
componentScanB
eanNameGenerator
,
registry
);
}
...
...
spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java
浏览文件 @
0a42c80c
...
...
@@ -43,7 +43,6 @@ import org.springframework.beans.factory.parsing.PassThroughSourceExtractor;
import
org.springframework.beans.factory.parsing.ProblemReporter
;
import
org.springframework.beans.factory.parsing.SourceExtractor
;
import
org.springframework.beans.factory.support.AbstractBeanDefinition
;
import
org.springframework.beans.factory.support.BeanDefinitionReaderUtils
;
import
org.springframework.beans.factory.support.BeanDefinitionRegistry
;
import
org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
;
import
org.springframework.beans.factory.support.BeanNameGenerator
;
...
...
@@ -88,6 +87,13 @@ import static org.springframework.context.annotation.AnnotationConfigUtils.*;
public
class
ConfigurationClassPostProcessor
implements
BeanDefinitionRegistryPostProcessor
,
ResourceLoaderAware
,
BeanClassLoaderAware
,
EnvironmentAware
{
private
static
final
String
IMPORT_AWARE_PROCESSOR_BEAN_NAME
=
ConfigurationClassPostProcessor
.
class
.
getName
()
+
".importAwareProcessor"
;
private
static
final
String
IMPORT_REGISTRY_BEAN_NAME
=
ConfigurationClassPostProcessor
.
class
.
getName
()
+
".importRegistry"
;
private
final
Log
logger
=
LogFactory
.
getLog
(
getClass
());
private
SourceExtractor
sourceExtractor
=
new
PassThroughSourceExtractor
();
...
...
@@ -110,7 +116,18 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
private
ConfigurationClassBeanDefinitionReader
reader
;
private
BeanNameGenerator
beanNameGenerator
=
new
AnnotationBeanNameGenerator
();
private
boolean
localBeanNameGeneratorSet
=
false
;
/* using short class names as default bean names */
private
BeanNameGenerator
componentScanBeanNameGenerator
=
new
AnnotationBeanNameGenerator
();
/* using fully qualified class names as default bean names */
private
BeanNameGenerator
importBeanNameGenerator
=
new
AnnotationBeanNameGenerator
()
{
@Override
protected
String
buildDefaultBeanName
(
BeanDefinition
definition
)
{
return
definition
.
getBeanClassName
();
}
};
/**
...
...
@@ -143,23 +160,27 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
}
/**
* Set the {@link BeanNameGenerator} to be used when registering imported and nested
* {@link Configuration} classes. The default is {@link AnnotationBeanNameGenerator}.
* Set the {@link BeanNameGenerator} to be used when triggering component scanning
* from {@link Configuration} classes and when registering {@link Import}'ed
* configuration classes. The default is a standard {@link AnnotationBeanNameGenerator}
* for scanned components (compatible with the default in {@link ClassPathBeanDefinitionScanner})
* and a variant thereof for imported configuration classes (using unique fully-qualified
* class names instead of standard component overriding).
* <p>Note that this strategy does <em>not</em> apply to {@link Bean} methods.
* <p>This setter is typically only appropriate when configuring the post-processor as
* a standalone bean definition in XML, e.g. not using the dedicated
* {@code AnnotationConfig*} application contexts or the {@code
* <context:annotation-config>} element. Any bean name generator specified against
* the application context will take precedence over any value set here.
* @param beanNameGenerator the strategy to use when generating configuration class
* bean names
* @since 3.1.1
* @see AnnotationConfigApplicationContext#setBeanNameGenerator(BeanNameGenerator)
* @see AnnotationConfigUtils#CONFIGURATION_BEAN_NAME_GENERATOR
*/
public
void
setBeanNameGenerator
(
BeanNameGenerator
beanNameGenerator
)
{
Assert
.
notNull
(
beanNameGenerator
,
"BeanNameGenerator must not be null"
);
this
.
beanNameGenerator
=
beanNameGenerator
;
this
.
localBeanNameGeneratorSet
=
true
;
this
.
componentScanBeanNameGenerator
=
beanNameGenerator
;
this
.
importBeanNameGenerator
=
beanNameGenerator
;
}
public
void
setEnvironment
(
Environment
environment
)
{
...
...
@@ -184,7 +205,8 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
* Derive further bean definitions from the configuration classes in the registry.
*/
public
void
postProcessBeanDefinitionRegistry
(
BeanDefinitionRegistry
registry
)
{
BeanDefinitionReaderUtils
.
registerWithGeneratedName
(
new
RootBeanDefinition
(
ImportAwareBeanPostProcessor
.
class
),
registry
);
registry
.
registerBeanDefinition
(
IMPORT_AWARE_PROCESSOR_BEAN_NAME
,
new
RootBeanDefinition
(
ImportAwareBeanPostProcessor
.
class
));
int
registryId
=
System
.
identityHashCode
(
registry
);
if
(
this
.
registriesPostProcessed
.
contains
(
registryId
))
{
throw
new
IllegalStateException
(
...
...
@@ -239,15 +261,17 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
SingletonBeanRegistry
singletonRegistry
=
null
;
if
(
registry
instanceof
SingletonBeanRegistry
)
{
singletonRegistry
=
(
SingletonBeanRegistry
)
registry
;
if
(
singletonRegistry
.
containsSingleton
(
CONFIGURATION_BEAN_NAME_GENERATOR
))
{
this
.
beanNameGenerator
=
(
BeanNameGenerator
)
singletonRegistry
.
getSingleton
(
CONFIGURATION_BEAN_NAME_GENERATOR
);
if
(!
this
.
localBeanNameGeneratorSet
&&
singletonRegistry
.
containsSingleton
(
CONFIGURATION_BEAN_NAME_GENERATOR
))
{
BeanNameGenerator
generator
=
(
BeanNameGenerator
)
singletonRegistry
.
getSingleton
(
CONFIGURATION_BEAN_NAME_GENERATOR
);
this
.
componentScanBeanNameGenerator
=
generator
;
this
.
importBeanNameGenerator
=
generator
;
}
}
// Parse each @Configuration class
ConfigurationClassParser
parser
=
new
ConfigurationClassParser
(
this
.
metadataReaderFactory
,
this
.
problemReporter
,
this
.
environment
,
this
.
resourceLoader
,
this
.
b
eanNameGenerator
,
registry
);
this
.
resourceLoader
,
this
.
componentScanB
eanNameGenerator
,
registry
);
for
(
BeanDefinitionHolder
holder
:
configCandidates
)
{
BeanDefinition
bd
=
holder
.
getBeanDefinition
();
try
{
...
...
@@ -282,16 +306,15 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
// Read the model and create bean definitions based on its content
if
(
this
.
reader
==
null
)
{
this
.
reader
=
new
ConfigurationClassBeanDefinitionReader
(
registry
,
this
.
sourceExtractor
,
this
.
problemReporter
,
this
.
metadataReaderFactory
,
this
.
resourceLoader
,
this
.
environment
,
this
.
beanNameGenerator
);
registry
,
this
.
sourceExtractor
,
this
.
problemReporter
,
this
.
metadataReaderFactory
,
this
.
resourceLoader
,
this
.
environment
,
this
.
importBeanNameGenerator
);
}
this
.
reader
.
loadBeanDefinitions
(
parser
.
getConfigurationClasses
());
// Register the ImportRegistry as a bean in order to support ImportAware @Configuration classes
if
(
singletonRegistry
!=
null
)
{
if
(!
singletonRegistry
.
containsSingleton
(
"importRegistry"
))
{
singletonRegistry
.
registerSingleton
(
"importRegistry"
,
parser
.
getImportRegistry
());
if
(!
singletonRegistry
.
containsSingleton
(
IMPORT_REGISTRY_BEAN_NAME
))
{
singletonRegistry
.
registerSingleton
(
IMPORT_REGISTRY_BEAN_NAME
,
parser
.
getImportRegistry
());
}
}
}
...
...
@@ -349,7 +372,7 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
public
Object
postProcessBeforeInitialization
(
Object
bean
,
String
beanName
)
throws
BeansException
{
if
(
bean
instanceof
ImportAware
)
{
ImportRegistry
importRegistry
=
beanFactory
.
getBean
(
ImportRegistry
.
class
);
ImportRegistry
importRegistry
=
this
.
beanFactory
.
getBean
(
IMPORT_REGISTRY_BEAN_NAME
,
ImportRegistry
.
class
);
String
importingClass
=
importRegistry
.
getImportingClassFor
(
bean
.
getClass
().
getSuperclass
().
getName
());
if
(
importingClass
!=
null
)
{
try
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录