15
15
*/
16
16
package org .springframework .data .repository .config ;
17
17
18
+ import java .lang .reflect .TypeVariable ;
19
+ import java .util .ArrayList ;
20
+ import java .util .Arrays ;
21
+ import java .util .Collection ;
22
+ import java .util .HashMap ;
23
+ import java .util .List ;
24
+ import java .util .Map ;
25
+ import java .util .stream .Collectors ;
26
+
18
27
import org .apache .commons .logging .Log ;
19
28
import org .apache .commons .logging .LogFactory ;
29
+
20
30
import org .springframework .beans .factory .config .BeanDefinition ;
21
31
import org .springframework .beans .factory .config .ConfigurableBeanFactory ;
22
32
import org .springframework .beans .factory .config .DependencyDescriptor ;
23
33
import org .springframework .beans .factory .parsing .BeanComponentDefinition ;
24
- import org .springframework .beans .factory .support .*;
34
+ import org .springframework .beans .factory .support .AutowireCandidateResolver ;
35
+ import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
36
+ import org .springframework .beans .factory .support .BeanDefinitionReaderUtils ;
37
+ import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
38
+ import org .springframework .beans .factory .support .DefaultListableBeanFactory ;
39
+ import org .springframework .beans .factory .support .RootBeanDefinition ;
25
40
import org .springframework .context .annotation .ContextAnnotationAutowireCandidateResolver ;
26
41
import org .springframework .context .support .GenericApplicationContext ;
27
42
import org .springframework .core .ResolvableType ;
43
58
import org .springframework .util .ClassUtils ;
44
59
import org .springframework .util .StopWatch ;
45
60
46
- import java .lang .reflect .TypeVariable ;
47
- import java .util .*;
48
- import java .util .stream .Collectors ;
49
-
50
61
/**
51
62
* Delegate for configuration integration to reuse the general way of detecting repositories. Customization is done by
52
63
* providing a configuration format specific {@link RepositoryConfigurationSource} (currently either XML or annotations
@@ -65,6 +76,9 @@ public class RepositoryConfigurationDelegate {
65
76
private static final String MULTIPLE_MODULES = "Multiple Spring Data modules found, entering strict repository configuration mode" ;
66
77
private static final String NON_DEFAULT_AUTOWIRE_CANDIDATE_RESOLVER = "Non-default AutowireCandidateResolver (%s) detected. Skipping the registration of LazyRepositoryInjectionPointResolver. Lazy repository injection will not be working" ;
67
78
79
+ private static final List <Class <?>> DEFAULT_AUTOWIRE_CANDIDATE_RESOLVERS = List
80
+ .of (ContextAnnotationAutowireCandidateResolver .class , LazyRepositoryInjectionPointResolver .class );
81
+
68
82
private static final Log logger = LogFactory .getLog (RepositoryConfigurationDelegate .class );
69
83
70
84
private final RepositoryConfigurationSource configurationSource ;
@@ -82,7 +96,7 @@ public class RepositoryConfigurationDelegate {
82
96
* @param environment must not be {@literal null}.
83
97
*/
84
98
public RepositoryConfigurationDelegate (RepositoryConfigurationSource configurationSource ,
85
- ResourceLoader resourceLoader , Environment environment ) {
99
+ ResourceLoader resourceLoader , Environment environment ) {
86
100
87
101
this .isXml = configurationSource instanceof XmlRepositoryConfigurationSource ;
88
102
boolean isAnnotation = configurationSource instanceof AnnotationRepositoryConfigurationSource ;
@@ -107,7 +121,7 @@ public RepositoryConfigurationDelegate(RepositoryConfigurationSource configurati
107
121
* {@link Environment}.
108
122
*/
109
123
private static Environment defaultEnvironment (@ Nullable Environment environment ,
110
- @ Nullable ResourceLoader resourceLoader ) {
124
+ @ Nullable ResourceLoader resourceLoader ) {
111
125
112
126
if (environment != null ) {
113
127
return environment ;
@@ -127,7 +141,7 @@ private static Environment defaultEnvironment(@Nullable Environment environment,
127
141
* @see org.springframework.beans.factory.support.BeanDefinitionRegistry
128
142
*/
129
143
public List <BeanComponentDefinition > registerRepositoriesIn (BeanDefinitionRegistry registry ,
130
- RepositoryConfigurationExtension extension ) {
144
+ RepositoryConfigurationExtension extension ) {
131
145
132
146
if (logger .isInfoEnabled ()) {
133
147
logger .info (LogMessage .format ("Bootstrapping Spring Data %s repositories in %s mode." , //
@@ -213,7 +227,7 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
213
227
}
214
228
215
229
private void registerAotComponents (BeanDefinitionRegistry registry , RepositoryConfigurationExtension extension ,
216
- Map <String , RepositoryConfigurationAdapter <?>> metadataByRepositoryBeanName ) {
230
+ Map <String , RepositoryConfigurationAdapter <?>> metadataByRepositoryBeanName ) {
217
231
218
232
BeanDefinitionBuilder repositoryAotProcessor = BeanDefinitionBuilder
219
233
.rootBeanDefinition (extension .getRepositoryAotProcessor ()).setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
@@ -236,37 +250,32 @@ private void registerAotComponents(BeanDefinitionRegistry registry, RepositoryCo
236
250
* @param registry must not be {@literal null}.
237
251
*/
238
252
private static void potentiallyLazifyRepositories (Map <String , RepositoryConfiguration <?>> configurations ,
239
- BeanDefinitionRegistry registry , BootstrapMode mode ) {
253
+ BeanDefinitionRegistry registry , BootstrapMode mode ) {
240
254
241
- if (!DefaultListableBeanFactory . class . isInstance (registry ) || BootstrapMode .DEFAULT .equals (mode )) {
255
+ if (!(registry instanceof DefaultListableBeanFactory beanFactory ) || BootstrapMode .DEFAULT .equals (mode )) {
242
256
return ;
243
257
}
244
258
245
- DefaultListableBeanFactory beanFactory = DefaultListableBeanFactory .class .cast (registry );
246
259
AutowireCandidateResolver resolver = beanFactory .getAutowireCandidateResolver ();
247
260
248
- if (!Arrays .asList (ContextAnnotationAutowireCandidateResolver .class , LazyRepositoryInjectionPointResolver .class )
249
- .contains (resolver .getClass ())) {
261
+ if (!DEFAULT_AUTOWIRE_CANDIDATE_RESOLVERS .contains (resolver .getClass ())) {
250
262
251
263
logger .warn (LogMessage .format (NON_DEFAULT_AUTOWIRE_CANDIDATE_RESOLVER , resolver .getClass ().getName ()));
252
-
253
264
return ;
254
265
}
255
266
256
- AutowireCandidateResolver newResolver = LazyRepositoryInjectionPointResolver . class . isInstance ( resolver ) //
257
- ? LazyRepositoryInjectionPointResolver . class . cast ( resolver ) .withAdditionalConfigurations (configurations ) //
267
+ AutowireCandidateResolver newResolver = resolver instanceof LazyRepositoryInjectionPointResolver lazy //
268
+ ? lazy .withAdditionalConfigurations (configurations ) //
258
269
: new LazyRepositoryInjectionPointResolver (configurations );
259
270
260
271
beanFactory .setAutowireCandidateResolver (newResolver );
261
272
262
- if (mode .equals (BootstrapMode .DEFERRED )) {
273
+ if (mode .equals (BootstrapMode .DEFERRED )
274
+ && !beanFactory .containsBean (DeferredRepositoryInitializationListener .class .getName ())) {
263
275
264
276
logger .debug ("Registering deferred repository initialization listener." );
265
-
266
- if (!beanFactory .containsBean (DeferredRepositoryInitializationListener .class .getName ())) {
267
- beanFactory .registerSingleton (DeferredRepositoryInitializationListener .class .getName (),
268
- new DeferredRepositoryInitializationListener (beanFactory ));
269
- }
277
+ beanFactory .registerSingleton (DeferredRepositoryInitializationListener .class .getName (),
278
+ new DeferredRepositoryInitializationListener (beanFactory ));
270
279
}
271
280
}
272
281
@@ -276,7 +285,7 @@ private static void potentiallyLazifyRepositories(Map<String, RepositoryConfigur
276
285
* scanning.
277
286
*
278
287
* @return {@literal true} if multiple data store repository implementations are present in the application. This
279
- * typically means an Spring application is using more than 1 type of data store.
288
+ * typically means a Spring application is using more than 1 type of data store.
280
289
*/
281
290
private boolean multipleStoresDetected () {
282
291
0 commit comments