Skip to content

Commit 1a81aed

Browse files
committed
Create ScannedGenericBeanDefinitions for index-derived components as well
Closes gh-24638
1 parent 5eb8430 commit 1a81aed

File tree

2 files changed

+31
-41
lines changed

2 files changed

+31
-41
lines changed

spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2019 the original author or authors.
2+
* Copyright 2002-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -29,7 +29,6 @@
2929

3030
import org.springframework.beans.factory.BeanDefinitionStoreException;
3131
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
32-
import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
3332
import org.springframework.beans.factory.annotation.Lookup;
3433
import org.springframework.beans.factory.config.BeanDefinition;
3534
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
@@ -386,8 +385,7 @@ private Set<BeanDefinition> addCandidateComponentsFromIndex(CandidateComponentsI
386385
for (String type : types) {
387386
MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(type);
388387
if (isCandidateComponent(metadataReader)) {
389-
AnnotatedGenericBeanDefinition sbd = new AnnotatedGenericBeanDefinition(
390-
metadataReader.getAnnotationMetadata());
388+
ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
391389
if (isCandidateComponent(sbd)) {
392390
if (debugEnabled) {
393391
logger.debug("Using candidate component class from index: " + type);

spring-context/src/test/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProviderTests.java

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import org.aspectj.lang.annotation.Aspect;
4141
import org.junit.Test;
4242

43-
import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
4443
import org.springframework.beans.factory.config.BeanDefinition;
4544
import org.springframework.context.index.CandidateComponentsTestClassLoader;
4645
import org.springframework.core.env.ConfigurableEnvironment;
@@ -80,18 +79,17 @@ public void defaultsWithScan() {
8079
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
8180
provider.setResourceLoader(new DefaultResourceLoader(
8281
CandidateComponentsTestClassLoader.disableIndex(getClass().getClassLoader())));
83-
testDefault(provider, ScannedGenericBeanDefinition.class);
82+
testDefault(provider);
8483
}
8584

8685
@Test
8786
public void defaultsWithIndex() {
8887
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
8988
provider.setResourceLoader(new DefaultResourceLoader(TEST_BASE_CLASSLOADER));
90-
testDefault(provider, AnnotatedGenericBeanDefinition.class);
89+
testDefault(provider);
9190
}
9291

93-
private void testDefault(ClassPathScanningCandidateComponentProvider provider,
94-
Class<? extends BeanDefinition> expectedBeanDefinitionType) {
92+
private void testDefault(ClassPathScanningCandidateComponentProvider provider) {
9593
Set<BeanDefinition> candidates = provider.findCandidateComponents(TEST_BASE_PACKAGE);
9694
assertTrue(containsBeanClass(candidates, DefaultNamedComponent.class));
9795
assertTrue(containsBeanClass(candidates, NamedComponent.class));
@@ -101,30 +99,29 @@ private void testDefault(ClassPathScanningCandidateComponentProvider provider,
10199
assertTrue(containsBeanClass(candidates, ServiceInvocationCounter.class));
102100
assertTrue(containsBeanClass(candidates, BarComponent.class));
103101
assertEquals(7, candidates.size());
104-
assertBeanDefinitionType(candidates, expectedBeanDefinitionType);
102+
assertBeanDefinitionType(candidates);
105103
}
106104

107105
@Test
108106
public void antStylePackageWithScan() {
109107
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
110108
provider.setResourceLoader(new DefaultResourceLoader(
111109
CandidateComponentsTestClassLoader.disableIndex(getClass().getClassLoader())));
112-
testAntStyle(provider, ScannedGenericBeanDefinition.class);
110+
testAntStyle(provider);
113111
}
114112

115113
@Test
116114
public void antStylePackageWithIndex() {
117115
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
118116
provider.setResourceLoader(new DefaultResourceLoader(TEST_BASE_CLASSLOADER));
119-
testAntStyle(provider, AnnotatedGenericBeanDefinition.class);
117+
testAntStyle(provider);
120118
}
121119

122-
private void testAntStyle(ClassPathScanningCandidateComponentProvider provider,
123-
Class<? extends BeanDefinition> expectedBeanDefinitionType) {
120+
private void testAntStyle(ClassPathScanningCandidateComponentProvider provider) {
124121
Set<BeanDefinition> candidates = provider.findCandidateComponents(TEST_BASE_PACKAGE + ".**.sub");
125122
assertTrue(containsBeanClass(candidates, BarComponent.class));
126123
assertEquals(1, candidates.size());
127-
assertBeanDefinitionType(candidates, expectedBeanDefinitionType);
124+
assertBeanDefinitionType(candidates);
128125
}
129126

130127
@Test
@@ -151,74 +148,71 @@ public void customFiltersFollowedByResetUseIndex() {
151148
provider.addIncludeFilter(new AnnotationTypeFilter(Component.class));
152149
provider.resetFilters(true);
153150
Set<BeanDefinition> candidates = provider.findCandidateComponents(TEST_BASE_PACKAGE);
154-
assertBeanDefinitionType(candidates, AnnotatedGenericBeanDefinition.class);
151+
assertBeanDefinitionType(candidates);
155152
}
156153

157154
@Test
158155
public void customAnnotationTypeIncludeFilterWithScan() {
159156
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
160157
provider.setResourceLoader(new DefaultResourceLoader(
161158
CandidateComponentsTestClassLoader.disableIndex(getClass().getClassLoader())));
162-
testCustomAnnotationTypeIncludeFilter(provider, ScannedGenericBeanDefinition.class);
159+
testCustomAnnotationTypeIncludeFilter(provider);
163160
}
164161

165162
@Test
166163
public void customAnnotationTypeIncludeFilterWithIndex() {
167164
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
168165
provider.setResourceLoader(new DefaultResourceLoader(TEST_BASE_CLASSLOADER));
169-
testCustomAnnotationTypeIncludeFilter(provider, AnnotatedGenericBeanDefinition.class);
166+
testCustomAnnotationTypeIncludeFilter(provider);
170167
}
171168

172-
private void testCustomAnnotationTypeIncludeFilter(ClassPathScanningCandidateComponentProvider provider,
173-
Class<? extends BeanDefinition> expectedBeanDefinitionType) {
169+
private void testCustomAnnotationTypeIncludeFilter(ClassPathScanningCandidateComponentProvider provider) {
174170
provider.addIncludeFilter(new AnnotationTypeFilter(Component.class));
175-
testDefault(provider, expectedBeanDefinitionType);
171+
testDefault(provider);
176172
}
177173

178174
@Test
179175
public void customAssignableTypeIncludeFilterWithScan() {
180176
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
181177
provider.setResourceLoader(new DefaultResourceLoader(
182178
CandidateComponentsTestClassLoader.disableIndex(getClass().getClassLoader())));
183-
testCustomAssignableTypeIncludeFilter(provider, ScannedGenericBeanDefinition.class);
179+
testCustomAssignableTypeIncludeFilter(provider);
184180
}
185181

186182
@Test
187183
public void customAssignableTypeIncludeFilterWithIndex() {
188184
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
189185
provider.setResourceLoader(new DefaultResourceLoader(TEST_BASE_CLASSLOADER));
190-
testCustomAssignableTypeIncludeFilter(provider, AnnotatedGenericBeanDefinition.class);
186+
testCustomAssignableTypeIncludeFilter(provider);
191187
}
192188

193-
private void testCustomAssignableTypeIncludeFilter(ClassPathScanningCandidateComponentProvider provider,
194-
Class<? extends BeanDefinition> expectedBeanDefinitionType) {
189+
private void testCustomAssignableTypeIncludeFilter(ClassPathScanningCandidateComponentProvider provider) {
195190
provider.addIncludeFilter(new AssignableTypeFilter(FooService.class));
196191
Set<BeanDefinition> candidates = provider.findCandidateComponents(TEST_BASE_PACKAGE);
197192
// Interfaces/Abstract class are filtered out automatically.
198193
assertTrue(containsBeanClass(candidates, AutowiredQualifierFooService.class));
199194
assertTrue(containsBeanClass(candidates, FooServiceImpl.class));
200195
assertTrue(containsBeanClass(candidates, ScopedProxyTestBean.class));
201196
assertEquals(3, candidates.size());
202-
assertBeanDefinitionType(candidates, expectedBeanDefinitionType);
197+
assertBeanDefinitionType(candidates);
203198
}
204199

205200
@Test
206201
public void customSupportedIncludeAndExcludedFilterWithScan() {
207202
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
208203
provider.setResourceLoader(new DefaultResourceLoader(
209204
CandidateComponentsTestClassLoader.disableIndex(getClass().getClassLoader())));
210-
testCustomSupportedIncludeAndExcludeFilter(provider, ScannedGenericBeanDefinition.class);
205+
testCustomSupportedIncludeAndExcludeFilter(provider);
211206
}
212207

213208
@Test
214209
public void customSupportedIncludeAndExcludeFilterWithIndex() {
215210
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
216211
provider.setResourceLoader(new DefaultResourceLoader(TEST_BASE_CLASSLOADER));
217-
testCustomSupportedIncludeAndExcludeFilter(provider, AnnotatedGenericBeanDefinition.class);
212+
testCustomSupportedIncludeAndExcludeFilter(provider);
218213
}
219214

220-
private void testCustomSupportedIncludeAndExcludeFilter(ClassPathScanningCandidateComponentProvider provider,
221-
Class<? extends BeanDefinition> expectedBeanDefinitionType) {
215+
private void testCustomSupportedIncludeAndExcludeFilter(ClassPathScanningCandidateComponentProvider provider) {
222216
provider.addIncludeFilter(new AnnotationTypeFilter(Component.class));
223217
provider.addExcludeFilter(new AnnotationTypeFilter(Service.class));
224218
provider.addExcludeFilter(new AnnotationTypeFilter(Repository.class));
@@ -227,7 +221,7 @@ private void testCustomSupportedIncludeAndExcludeFilter(ClassPathScanningCandida
227221
assertTrue(containsBeanClass(candidates, ServiceInvocationCounter.class));
228222
assertTrue(containsBeanClass(candidates, BarComponent.class));
229223
assertEquals(3, candidates.size());
230-
assertBeanDefinitionType(candidates, expectedBeanDefinitionType);
224+
assertBeanDefinitionType(candidates);
231225
}
232226

233227
@Test
@@ -240,7 +234,7 @@ public void customSupportIncludeFilterWithNonIndexedTypeUseScan() {
240234
Set<BeanDefinition> candidates = provider.findCandidateComponents(TEST_BASE_PACKAGE);
241235
assertTrue(containsBeanClass(candidates, DefaultNamedComponent.class));
242236
assertEquals(1, candidates.size());
243-
assertBeanDefinitionType(candidates, ScannedGenericBeanDefinition.class);
237+
assertBeanDefinitionType(candidates);
244238
}
245239

246240
@Test
@@ -251,7 +245,7 @@ public void customNotSupportedIncludeFilterUseScan() {
251245
Set<BeanDefinition> candidates = provider.findCandidateComponents(TEST_BASE_PACKAGE);
252246
assertTrue(containsBeanClass(candidates, StubFooDao.class));
253247
assertEquals(1, candidates.size());
254-
assertBeanDefinitionType(candidates, ScannedGenericBeanDefinition.class);
248+
assertBeanDefinitionType(candidates);
255249
}
256250

257251
@Test
@@ -260,26 +254,25 @@ public void excludeFilterWithScan() {
260254
provider.setResourceLoader(new DefaultResourceLoader(
261255
CandidateComponentsTestClassLoader.disableIndex(getClass().getClassLoader())));
262256
provider.addExcludeFilter(new RegexPatternTypeFilter(Pattern.compile(TEST_BASE_PACKAGE + ".*Named.*")));
263-
testExclude(provider, ScannedGenericBeanDefinition.class);
257+
testExclude(provider);
264258
}
265259

266260
@Test
267261
public void excludeFilterWithIndex() {
268262
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
269263
provider.setResourceLoader(new DefaultResourceLoader(TEST_BASE_CLASSLOADER));
270264
provider.addExcludeFilter(new RegexPatternTypeFilter(Pattern.compile(TEST_BASE_PACKAGE + ".*Named.*")));
271-
testExclude(provider, AnnotatedGenericBeanDefinition.class);
265+
testExclude(provider);
272266
}
273267

274-
private void testExclude(ClassPathScanningCandidateComponentProvider provider,
275-
Class<? extends BeanDefinition> expectedBeanDefinitionType) {
268+
private void testExclude(ClassPathScanningCandidateComponentProvider provider) {
276269
Set<BeanDefinition> candidates = provider.findCandidateComponents(TEST_BASE_PACKAGE);
277270
assertTrue(containsBeanClass(candidates, FooServiceImpl.class));
278271
assertTrue(containsBeanClass(candidates, StubFooDao.class));
279272
assertTrue(containsBeanClass(candidates, ServiceInvocationCounter.class));
280273
assertTrue(containsBeanClass(candidates, BarComponent.class));
281274
assertEquals(4, candidates.size());
282-
assertBeanDefinitionType(candidates, expectedBeanDefinitionType);
275+
assertBeanDefinitionType(candidates);
283276
}
284277

285278
@Test
@@ -510,10 +503,9 @@ private boolean containsBeanClass(Set<BeanDefinition> candidates, Class<?> beanC
510503
return false;
511504
}
512505

513-
private void assertBeanDefinitionType(Set<BeanDefinition> candidates,
514-
Class<? extends BeanDefinition> expectedType) {
506+
private void assertBeanDefinitionType(Set<BeanDefinition> candidates) {
515507
candidates.forEach(c -> {
516-
assertThat(c, is(instanceOf(expectedType)));
508+
assertThat(c, is(instanceOf(ScannedGenericBeanDefinition.class)));
517509
});
518510
}
519511

0 commit comments

Comments
 (0)