Skip to content

Commit 3d8cbe0

Browse files
committed
Drop using FACTORY_BEAN_OBJECT_TYPE attribute entirely.
We now constantly use RootBeanDefinition.setBeanClass(…) (for the raw factory type) and ….setTargetType(…) to declare the actual repository type. Ticket: #2894.
1 parent d98eeef commit 3d8cbe0

File tree

3 files changed

+15
-28
lines changed

3 files changed

+15
-28
lines changed

Diff for: src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,16 @@
2525

2626
import org.apache.commons.logging.Log;
2727
import org.apache.commons.logging.LogFactory;
28-
import org.springframework.beans.factory.FactoryBean;
2928
import org.springframework.beans.factory.config.BeanDefinition;
3029
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
3130
import org.springframework.beans.factory.config.DependencyDescriptor;
3231
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
33-
import org.springframework.beans.factory.support.AbstractBeanDefinition;
3432
import org.springframework.beans.factory.support.AutowireCandidateResolver;
3533
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
3634
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
3735
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
3836
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
37+
import org.springframework.beans.factory.support.RootBeanDefinition;
3938
import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
4039
import org.springframework.context.support.GenericApplicationContext;
4140
import org.springframework.core.env.Environment;
@@ -70,7 +69,6 @@ public class RepositoryConfigurationDelegate {
7069
private static final String REPOSITORY_REGISTRATION = "Spring Data %s - Registering repository: %s - Interface: %s - Factory: %s";
7170
private static final String MULTIPLE_MODULES = "Multiple Spring Data modules found, entering strict repository configuration mode";
7271
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";
73-
private static final String FACTORY_BEAN_OBJECT_TYPE = FactoryBean.OBJECT_TYPE_ATTRIBUTE;
7472

7573
private static final Log logger = LogFactory.getLog(RepositoryConfigurationDelegate.class);
7674

@@ -183,9 +181,10 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
183181
extension.postProcess(definitionBuilder, (AnnotationRepositoryConfigurationSource) configurationSource);
184182
}
185183

186-
AbstractBeanDefinition beanDefinition = definitionBuilder.getBeanDefinition();
184+
RootBeanDefinition beanDefinition = (RootBeanDefinition) definitionBuilder.getBeanDefinition();
187185

188-
beanDefinition.setAttribute(FACTORY_BEAN_OBJECT_TYPE, getRepositoryInterface(configuration));
186+
beanDefinition.setTargetType(getRepositoryInterface(configuration));
187+
// beanDefinition.setAttribute(FACTORY_BEAN_OBJECT_TYPE, getRepositoryInterface(configuration));
189188
beanDefinition.setResourceDescription(configuration.getResourceDescription());
190189

191190
String beanName = configurationSource.generateBeanName(beanDefinition);
@@ -323,7 +322,8 @@ private Class<?> getRepositoryInterface(RepositoryConfiguration<?> configuration
323322
? ClassUtils.getDefaultClassLoader()
324323
: resourceLoader.getClassLoader();
325324

326-
return ReflectionUtils.loadIfPresent(interfaceName, classLoader);
325+
return ReflectionUtils.loadIfPresent(interfaceName,
326+
classLoader != null ? classLoader : getClass().getClassLoader());
327327
}
328328

329329
/**

Diff for: src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotContribution.java

+2-18
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.springframework.beans.factory.support.RegisteredBean;
4040
import org.springframework.beans.factory.support.RootBeanDefinition;
4141
import org.springframework.core.DecoratingProxy;
42-
import org.springframework.core.ResolvableType;
4342
import org.springframework.core.annotation.AnnotationUtils;
4443
import org.springframework.data.aot.AotContext;
4544
import org.springframework.data.projection.EntityProjectionIntrospector;
@@ -219,18 +218,9 @@ protected void enhanceRepositoryBeanDefinition(RegisteredBean repositoryBean,
219218
.introspectType(repositoryMetadata.getRepositoryFactoryBeanClassName()).resolveType()
220219
.orElse(RepositoryFactoryBeanSupport.class);
221220

222-
ResolvableType resolvedRepositoryFactoryBeanType = ResolvableType.forClass(repositoryFactoryBeanType);
223-
224221
RootBeanDefinition repositoryBeanDefinition = repositoryBean.getMergedBeanDefinition();
225-
226-
if (isRepositoryWithTypeParameters(resolvedRepositoryFactoryBeanType)) {
227-
repositoryBeanDefinition.setTargetType(ResolvableType.forClassWithGenerics(repositoryFactoryBeanType,
228-
repositoryContext.getRepositoryInformation().getRepositoryInterface(), Object.class, Object.class));
229-
} else {
230-
repositoryBeanDefinition.setTargetType(resolvedRepositoryFactoryBeanType);
231-
repositoryBeanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE,
232-
repositoryContext.getRepositoryInformation().getRepositoryInterface());
233-
}
222+
repositoryBeanDefinition.setBeanClass(repositoryFactoryBeanType);
223+
repositoryBeanDefinition.setTargetType(repositoryContext.getRepositoryInformation().getRepositoryInterface());
234224
}
235225

236226
/**
@@ -239,8 +229,6 @@ protected void enhanceRepositoryBeanDefinition(RegisteredBean repositoryBean,
239229
* @param moduleContribution {@link BiConsumer} used by data modules to submit contributions; can be {@literal null}.
240230
* @return this.
241231
*/
242-
243-
@SuppressWarnings("unused")
244232
public RepositoryRegistrationAotContribution withModuleContribution(
245233
@Nullable BiConsumer<AotRepositoryContext, GenerationContext> moduleContribution) {
246234
this.moduleContribution = moduleContribution;
@@ -385,8 +373,4 @@ static boolean isJavaOrPrimitiveType(Class<?> type) {
385373
public Predicate<Class<?>> typeFilter() { // like only document ones. // TODO: As in MongoDB?
386374
return it -> true;
387375
}
388-
389-
private static boolean isRepositoryWithTypeParameters(ResolvableType type) {
390-
return type.getGenerics().length == 3;
391-
}
392376
}

Diff for: src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import org.mockito.quality.Strictness;
2626
import org.springframework.aop.framework.Advised;
2727
import org.springframework.aot.hint.RuntimeHints;
28-
import org.springframework.beans.factory.FactoryBean;
2928
import org.springframework.beans.factory.ListableBeanFactory;
29+
import org.springframework.beans.factory.support.RootBeanDefinition;
3030
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
3131
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
3232
import org.springframework.context.annotation.ComponentScan;
@@ -76,10 +76,13 @@ void registersRepositoryBeanNameAsAttribute() {
7676
for (var definition : delegate.registerRepositoriesIn(context, extension)) {
7777

7878
var beanDefinition = definition.getBeanDefinition();
79-
var attribute = beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE);
8079

81-
assertThat(attribute).isInstanceOfSatisfying(Class.class, it -> {
82-
assertThat(it.getName()).endsWith("Repository");
80+
assertThat(beanDefinition).isInstanceOfSatisfying(RootBeanDefinition.class, it -> {
81+
82+
var type = it.getTargetType();
83+
84+
assertThat(type).isNotNull();
85+
assertThat(type.getName()).endsWith("Repository");
8386
});
8487
}
8588
}

0 commit comments

Comments
 (0)