1515 */
1616package org .springframework .data .repository .config ;
1717
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+
1827import org .apache .commons .logging .Log ;
1928import org .apache .commons .logging .LogFactory ;
29+
2030import org .springframework .beans .factory .config .BeanDefinition ;
2131import org .springframework .beans .factory .config .ConfigurableBeanFactory ;
2232import org .springframework .beans .factory .config .DependencyDescriptor ;
2333import 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 ;
2540import org .springframework .context .annotation .ContextAnnotationAutowireCandidateResolver ;
2641import org .springframework .context .support .GenericApplicationContext ;
2742import org .springframework .core .ResolvableType ;
4257import org .springframework .util .Assert ;
4358import org .springframework .util .StopWatch ;
4459
45- import java .lang .reflect .TypeVariable ;
46- import java .util .*;
47- import java .util .stream .Collectors ;
48-
4960/**
5061 * Delegate for configuration integration to reuse the general way of detecting repositories. Customization is done by
5162 * providing a configuration format specific {@link RepositoryConfigurationSource} (currently either XML or annotations
@@ -64,6 +75,9 @@ public class RepositoryConfigurationDelegate {
6475 private static final String MULTIPLE_MODULES = "Multiple Spring Data modules found, entering strict repository configuration mode" ;
6576 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" ;
6677
78+ private static final List <Class <?>> DEFAULT_AUTOWIRE_CANDIDATE_RESOLVERS = List
79+ .of (ContextAnnotationAutowireCandidateResolver .class , LazyRepositoryInjectionPointResolver .class );
80+
6781 private static final Log logger = LogFactory .getLog (RepositoryConfigurationDelegate .class );
6882
6983 private final RepositoryConfigurationSource configurationSource ;
@@ -81,7 +95,7 @@ public class RepositoryConfigurationDelegate {
8195 * @param environment must not be {@literal null}.
8296 */
8397 public RepositoryConfigurationDelegate (RepositoryConfigurationSource configurationSource ,
84- ResourceLoader resourceLoader , Environment environment ) {
98+ ResourceLoader resourceLoader , Environment environment ) {
8599
86100 this .isXml = configurationSource instanceof XmlRepositoryConfigurationSource ;
87101 boolean isAnnotation = configurationSource instanceof AnnotationRepositoryConfigurationSource ;
@@ -106,7 +120,7 @@ public RepositoryConfigurationDelegate(RepositoryConfigurationSource configurati
106120 * {@link Environment}.
107121 */
108122 private static Environment defaultEnvironment (@ Nullable Environment environment ,
109- @ Nullable ResourceLoader resourceLoader ) {
123+ @ Nullable ResourceLoader resourceLoader ) {
110124
111125 if (environment != null ) {
112126 return environment ;
@@ -125,7 +139,7 @@ private static Environment defaultEnvironment(@Nullable Environment environment,
125139 * @see org.springframework.beans.factory.support.BeanDefinitionRegistry
126140 */
127141 public List <BeanComponentDefinition > registerRepositoriesIn (BeanDefinitionRegistry registry ,
128- RepositoryConfigurationExtension extension ) {
142+ RepositoryConfigurationExtension extension ) {
129143
130144 if (logger .isInfoEnabled ()) {
131145 logger .info (LogMessage .format ("Bootstrapping Spring Data %s repositories in %s mode." , //
@@ -211,7 +225,7 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
211225 }
212226
213227 private void registerAotComponents (BeanDefinitionRegistry registry , RepositoryConfigurationExtension extension ,
214- Map <String , RepositoryConfigurationAdapter <?>> metadataByRepositoryBeanName ) {
228+ Map <String , RepositoryConfigurationAdapter <?>> metadataByRepositoryBeanName ) {
215229
216230 BeanDefinitionBuilder repositoryAotProcessor = BeanDefinitionBuilder
217231 .rootBeanDefinition (extension .getRepositoryAotProcessor ()).setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
@@ -234,37 +248,32 @@ private void registerAotComponents(BeanDefinitionRegistry registry, RepositoryCo
234248 * @param registry must not be {@literal null}.
235249 */
236250 private static void potentiallyLazifyRepositories (Map <String , RepositoryConfiguration <?>> configurations ,
237- BeanDefinitionRegistry registry , BootstrapMode mode ) {
251+ BeanDefinitionRegistry registry , BootstrapMode mode ) {
238252
239- if (!DefaultListableBeanFactory . class . isInstance (registry ) || BootstrapMode .DEFAULT .equals (mode )) {
253+ if (!(registry instanceof DefaultListableBeanFactory beanFactory ) || BootstrapMode .DEFAULT .equals (mode )) {
240254 return ;
241255 }
242256
243- DefaultListableBeanFactory beanFactory = DefaultListableBeanFactory .class .cast (registry );
244257 AutowireCandidateResolver resolver = beanFactory .getAutowireCandidateResolver ();
245258
246- if (!Arrays .asList (ContextAnnotationAutowireCandidateResolver .class , LazyRepositoryInjectionPointResolver .class )
247- .contains (resolver .getClass ())) {
259+ if (!DEFAULT_AUTOWIRE_CANDIDATE_RESOLVERS .contains (resolver .getClass ())) {
248260
249261 logger .warn (LogMessage .format (NON_DEFAULT_AUTOWIRE_CANDIDATE_RESOLVER , resolver .getClass ().getName ()));
250-
251262 return ;
252263 }
253264
254- AutowireCandidateResolver newResolver = LazyRepositoryInjectionPointResolver . class . isInstance ( resolver ) //
255- ? LazyRepositoryInjectionPointResolver . class . cast ( resolver ) .withAdditionalConfigurations (configurations ) //
265+ AutowireCandidateResolver newResolver = resolver instanceof LazyRepositoryInjectionPointResolver lazy //
266+ ? lazy .withAdditionalConfigurations (configurations ) //
256267 : new LazyRepositoryInjectionPointResolver (configurations );
257268
258269 beanFactory .setAutowireCandidateResolver (newResolver );
259270
260- if (mode .equals (BootstrapMode .DEFERRED )) {
271+ if (mode .equals (BootstrapMode .DEFERRED )
272+ && !beanFactory .containsBean (DeferredRepositoryInitializationListener .class .getName ())) {
261273
262274 logger .debug ("Registering deferred repository initialization listener." );
263-
264- if (!beanFactory .containsBean (DeferredRepositoryInitializationListener .class .getName ())) {
265- beanFactory .registerSingleton (DeferredRepositoryInitializationListener .class .getName (),
266- new DeferredRepositoryInitializationListener (beanFactory ));
267- }
275+ beanFactory .registerSingleton (DeferredRepositoryInitializationListener .class .getName (),
276+ new DeferredRepositoryInitializationListener (beanFactory ));
268277 }
269278 }
270279
@@ -274,7 +283,7 @@ private static void potentiallyLazifyRepositories(Map<String, RepositoryConfigur
274283 * scanning.
275284 *
276285 * @return {@literal true} if multiple data store repository implementations are present in the application. This
277- * typically means an Spring application is using more than 1 type of data store.
286+ * typically means a Spring application is using more than 1 type of data store.
278287 */
279288 private boolean multipleStoresDetected () {
280289
0 commit comments