Polishing

This commit is contained in:
Juergen Hoeller 2024-07-10 15:15:32 +02:00
parent 300f4585be
commit 3ccaefe38f
5 changed files with 57 additions and 69 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2023 the original author or authors. * Copyright 2002-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -79,8 +79,8 @@ class ScopedProxyBeanRegistrationAotProcessor implements BeanRegistrationAotProc
} }
@Nullable @Nullable
private BeanDefinition getTargetBeanDefinition(ConfigurableBeanFactory beanFactory, private BeanDefinition getTargetBeanDefinition(
@Nullable String targetBeanName) { ConfigurableBeanFactory beanFactory, @Nullable String targetBeanName) {
if (targetBeanName != null && beanFactory.containsBean(targetBeanName)) { if (targetBeanName != null && beanFactory.containsBean(targetBeanName)) {
return beanFactory.getMergedBeanDefinition(targetBeanName); return beanFactory.getMergedBeanDefinition(targetBeanName);
@ -123,16 +123,12 @@ class ScopedProxyBeanRegistrationAotProcessor implements BeanRegistrationAotProc
@Override @Override
public CodeBlock generateSetBeanDefinitionPropertiesCode( public CodeBlock generateSetBeanDefinitionPropertiesCode(
GenerationContext generationContext, GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
BeanRegistrationCode beanRegistrationCode,
RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) { RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {
RootBeanDefinition processedBeanDefinition = new RootBeanDefinition( RootBeanDefinition processedBeanDefinition = new RootBeanDefinition(beanDefinition);
beanDefinition); processedBeanDefinition.setTargetType(this.targetBeanDefinition.getResolvableType());
processedBeanDefinition processedBeanDefinition.getPropertyValues().removePropertyValue("targetBeanName");
.setTargetType(this.targetBeanDefinition.getResolvableType());
processedBeanDefinition.getPropertyValues()
.removePropertyValue("targetBeanName");
return super.generateSetBeanDefinitionPropertiesCode(generationContext, return super.generateSetBeanDefinitionPropertiesCode(generationContext,
beanRegistrationCode, processedBeanDefinition, attributeFilter); beanRegistrationCode, processedBeanDefinition, attributeFilter);
} }
@ -143,20 +139,15 @@ class ScopedProxyBeanRegistrationAotProcessor implements BeanRegistrationAotProc
GeneratedMethod generatedMethod = beanRegistrationCode.getMethods() GeneratedMethod generatedMethod = beanRegistrationCode.getMethods()
.add("getScopedProxyInstance", method -> { .add("getScopedProxyInstance", method -> {
method.addJavadoc( method.addJavadoc("Create the scoped proxy bean instance for '$L'.",
"Create the scoped proxy bean instance for '$L'.",
this.registeredBean.getBeanName()); this.registeredBean.getBeanName());
method.addModifiers(Modifier.PRIVATE, Modifier.STATIC); method.addModifiers(Modifier.PRIVATE, Modifier.STATIC);
method.returns(ScopedProxyFactoryBean.class); method.returns(ScopedProxyFactoryBean.class);
method.addParameter(RegisteredBean.class, method.addParameter(RegisteredBean.class, REGISTERED_BEAN_PARAMETER_NAME);
REGISTERED_BEAN_PARAMETER_NAME);
method.addStatement("$T factory = new $T()", method.addStatement("$T factory = new $T()",
ScopedProxyFactoryBean.class, ScopedProxyFactoryBean.class, ScopedProxyFactoryBean.class);
ScopedProxyFactoryBean.class); method.addStatement("factory.setTargetBeanName($S)", this.targetBeanName);
method.addStatement("factory.setTargetBeanName($S)", method.addStatement("factory.setBeanFactory($L.getBeanFactory())",
this.targetBeanName);
method.addStatement(
"factory.setBeanFactory($L.getBeanFactory())",
REGISTERED_BEAN_PARAMETER_NAME); REGISTERED_BEAN_PARAMETER_NAME);
method.addStatement("return factory"); method.addStatement("return factory");
}); });

View File

@ -1098,7 +1098,6 @@ public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationA
} }
} }
} }
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2023 the original author or authors. * Copyright 2002-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -58,39 +58,39 @@ public class BeanRegistrationCodeFragmentsDecorator implements BeanRegistrationC
public CodeBlock generateNewBeanDefinitionCode(GenerationContext generationContext, public CodeBlock generateNewBeanDefinitionCode(GenerationContext generationContext,
ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) { ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) {
return this.delegate.generateNewBeanDefinitionCode(generationContext, return this.delegate.generateNewBeanDefinitionCode(generationContext, beanType, beanRegistrationCode);
beanType, beanRegistrationCode);
} }
@Override @Override
public CodeBlock generateSetBeanDefinitionPropertiesCode(GenerationContext generationContext, public CodeBlock generateSetBeanDefinitionPropertiesCode(
BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition, GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
Predicate<String> attributeFilter) { RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {
return this.delegate.generateSetBeanDefinitionPropertiesCode( return this.delegate.generateSetBeanDefinitionPropertiesCode(
generationContext, beanRegistrationCode, beanDefinition, attributeFilter); generationContext, beanRegistrationCode, beanDefinition, attributeFilter);
} }
@Override @Override
public CodeBlock generateSetBeanInstanceSupplierCode(GenerationContext generationContext, public CodeBlock generateSetBeanInstanceSupplierCode(
BeanRegistrationCode beanRegistrationCode, CodeBlock instanceSupplierCode, GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
List<MethodReference> postProcessors) { CodeBlock instanceSupplierCode, List<MethodReference> postProcessors) {
return this.delegate.generateSetBeanInstanceSupplierCode(generationContext, return this.delegate.generateSetBeanInstanceSupplierCode(generationContext,
beanRegistrationCode, instanceSupplierCode, postProcessors); beanRegistrationCode, instanceSupplierCode, postProcessors);
} }
@Override @Override
public CodeBlock generateInstanceSupplierCode(GenerationContext generationContext, public CodeBlock generateInstanceSupplierCode(
BeanRegistrationCode beanRegistrationCode, boolean allowDirectSupplierShortcut) { GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
boolean allowDirectSupplierShortcut) {
return this.delegate.generateInstanceSupplierCode(generationContext, return this.delegate.generateInstanceSupplierCode(generationContext,
beanRegistrationCode, allowDirectSupplierShortcut); beanRegistrationCode, allowDirectSupplierShortcut);
} }
@Override @Override
public CodeBlock generateReturnCode(GenerationContext generationContext, public CodeBlock generateReturnCode(
BeanRegistrationCode beanRegistrationCode) { GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode) {
return this.delegate.generateReturnCode(generationContext, beanRegistrationCode); return this.delegate.generateReturnCode(generationContext, beanRegistrationCode);
} }

View File

@ -46,8 +46,7 @@ import org.springframework.util.ClassUtils;
import org.springframework.util.function.SingletonSupplier; import org.springframework.util.function.SingletonSupplier;
/** /**
* Internal {@link BeanRegistrationCodeFragments} implementation used by * Internal {@link BeanRegistrationCodeFragments} implementation used by default.
* default.
* *
* @author Phillip Webb * @author Phillip Webb
* @author Stephane Nicoll * @author Stephane Nicoll
@ -81,7 +80,8 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
if (hasInstanceSupplier()) { if (hasInstanceSupplier()) {
String resourceDescription = registeredBean.getMergedBeanDefinition().getResourceDescription(); String resourceDescription = registeredBean.getMergedBeanDefinition().getResourceDescription();
throw new IllegalStateException("Error processing bean with name '" + registeredBean.getBeanName() + "'" + throw new IllegalStateException("Error processing bean with name '" + registeredBean.getBeanName() + "'" +
(resourceDescription != null ? " defined in " + resourceDescription : "") + ": instance supplier is not supported"); (resourceDescription != null ? " defined in " + resourceDescription : "") +
": instance supplier is not supported");
} }
Class<?> target = extractDeclaringClass(registeredBean, this.instantiationDescriptor.get()); Class<?> target = extractDeclaringClass(registeredBean, this.instantiationDescriptor.get());
while (target.getName().startsWith("java.") && registeredBean.isInnerBean()) { while (target.getName().startsWith("java.") && registeredBean.isInnerBean()) {
@ -94,9 +94,8 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
private Class<?> extractDeclaringClass(RegisteredBean registeredBean, InstantiationDescriptor instantiationDescriptor) { private Class<?> extractDeclaringClass(RegisteredBean registeredBean, InstantiationDescriptor instantiationDescriptor) {
Class<?> declaringClass = ClassUtils.getUserClass(instantiationDescriptor.targetClass()); Class<?> declaringClass = ClassUtils.getUserClass(instantiationDescriptor.targetClass());
if (instantiationDescriptor.executable() instanceof Constructor<?> if (instantiationDescriptor.executable() instanceof Constructor<?> ctor &&
&& AccessControl.forMember(instantiationDescriptor.executable()).isPublic() AccessControl.forMember(ctor).isPublic() && FactoryBean.class.isAssignableFrom(declaringClass)) {
&& FactoryBean.class.isAssignableFrom(declaringClass)) {
return extractTargetClassFromFactoryBean(declaringClass, registeredBean.getBeanType()); return extractTargetClassFromFactoryBean(declaringClass, registeredBean.getBeanType());
} }
return declaringClass; return declaringClass;
@ -127,17 +126,15 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) { ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) {
CodeBlock.Builder code = CodeBlock.builder(); CodeBlock.Builder code = CodeBlock.builder();
RootBeanDefinition mergedBeanDefinition = this.registeredBean.getMergedBeanDefinition(); RootBeanDefinition mbd = this.registeredBean.getMergedBeanDefinition();
Class<?> beanClass = (mergedBeanDefinition.hasBeanClass() Class<?> beanClass = (mbd.hasBeanClass() ? ClassUtils.getUserClass(mbd.getBeanClass()) : null);
? ClassUtils.getUserClass(mergedBeanDefinition.getBeanClass()) : null);
CodeBlock beanClassCode = generateBeanClassCode( CodeBlock beanClassCode = generateBeanClassCode(
beanRegistrationCode.getClassName().packageName(), beanRegistrationCode.getClassName().packageName(),
(beanClass != null ? beanClass : beanType.toClass())); (beanClass != null ? beanClass : beanType.toClass()));
code.addStatement("$T $L = new $T($L)", RootBeanDefinition.class, code.addStatement("$T $L = new $T($L)", RootBeanDefinition.class,
BEAN_DEFINITION_VARIABLE, RootBeanDefinition.class, beanClassCode); BEAN_DEFINITION_VARIABLE, RootBeanDefinition.class, beanClassCode);
if (targetTypeNecessary(beanType, beanClass)) { if (targetTypeNecessary(beanType, beanClass)) {
code.addStatement("$L.setTargetType($L)", BEAN_DEFINITION_VARIABLE, code.addStatement("$L.setTargetType($L)", BEAN_DEFINITION_VARIABLE, generateBeanTypeCode(beanType));
generateBeanTypeCode(beanType));
} }
return code.build(); return code.build();
} }
@ -162,8 +159,7 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
if (beanType.hasGenerics()) { if (beanType.hasGenerics()) {
return true; return true;
} }
if (beanClass != null if (beanClass != null && this.registeredBean.getMergedBeanDefinition().getFactoryMethodName() != null) {
&& this.registeredBean.getMergedBeanDefinition().getFactoryMethodName() != null) {
return true; return true;
} }
return (beanClass != null && !beanType.toClass().equals(beanClass)); return (beanClass != null && !beanType.toClass().equals(beanClass));
@ -171,21 +167,19 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
@Override @Override
public CodeBlock generateSetBeanDefinitionPropertiesCode( public CodeBlock generateSetBeanDefinitionPropertiesCode(
GenerationContext generationContext, GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition, RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {
Predicate<String> attributeFilter) {
Loader loader = AotServices.factories(this.registeredBean.getBeanFactory().getBeanClassLoader()); Loader loader = AotServices.factories(this.registeredBean.getBeanFactory().getBeanClassLoader());
List<Delegate> additionalDelegates = loader.load(Delegate.class).asList(); List<Delegate> additionalDelegates = loader.load(Delegate.class).asList();
return new BeanDefinitionPropertiesCodeGenerator(generationContext.getRuntimeHints(), return new BeanDefinitionPropertiesCodeGenerator(generationContext.getRuntimeHints(),
attributeFilter, beanRegistrationCode.getMethods(), attributeFilter, beanRegistrationCode.getMethods(),
additionalDelegates, (name, value) -> generateValueCode(generationContext, name, value) additionalDelegates, (name, value) -> generateValueCode(generationContext, name, value))
).generateCode(beanDefinition); .generateCode(beanDefinition);
} }
@Nullable @Nullable
protected CodeBlock generateValueCode(GenerationContext generationContext, protected CodeBlock generateValueCode(GenerationContext generationContext, String name, Object value) {
String name, Object value) {
RegisteredBean innerRegisteredBean = getInnerRegisteredBean(value); RegisteredBean innerRegisteredBean = getInnerRegisteredBean(value);
if (innerRegisteredBean != null) { if (innerRegisteredBean != null) {
BeanDefinitionMethodGenerator methodGenerator = this.beanDefinitionMethodGeneratorFactory BeanDefinitionMethodGenerator methodGenerator = this.beanDefinitionMethodGeneratorFactory
@ -211,9 +205,8 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
@Override @Override
public CodeBlock generateSetBeanInstanceSupplierCode( public CodeBlock generateSetBeanInstanceSupplierCode(
GenerationContext generationContext, GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
BeanRegistrationCode beanRegistrationCode, CodeBlock instanceSupplierCode, CodeBlock instanceSupplierCode, List<MethodReference> postProcessors) {
List<MethodReference> postProcessors) {
CodeBlock.Builder code = CodeBlock.builder(); CodeBlock.Builder code = CodeBlock.builder();
if (postProcessors.isEmpty()) { if (postProcessors.isEmpty()) {
@ -233,20 +226,22 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
} }
@Override @Override
public CodeBlock generateInstanceSupplierCode(GenerationContext generationContext, public CodeBlock generateInstanceSupplierCode(
BeanRegistrationCode beanRegistrationCode, boolean allowDirectSupplierShortcut) { GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
boolean allowDirectSupplierShortcut) {
if (hasInstanceSupplier()) { if (hasInstanceSupplier()) {
throw new IllegalStateException("Default code generation is not supported for bean definitions declaring " throw new IllegalStateException("Default code generation is not supported for bean definitions " +
+ "an instance supplier callback: " + this.registeredBean.getMergedBeanDefinition()); "declaring an instance supplier callback: " + this.registeredBean.getMergedBeanDefinition());
} }
return new InstanceSupplierCodeGenerator(generationContext, beanRegistrationCode.getClassName(), return new InstanceSupplierCodeGenerator(generationContext, beanRegistrationCode.getClassName(),
beanRegistrationCode.getMethods(), allowDirectSupplierShortcut).generateCode( beanRegistrationCode.getMethods(), allowDirectSupplierShortcut)
this.registeredBean, this.instantiationDescriptor.get()); .generateCode(this.registeredBean, this.instantiationDescriptor.get());
} }
@Override @Override
public CodeBlock generateReturnCode(GenerationContext generationContext, public CodeBlock generateReturnCode(
BeanRegistrationCode beanRegistrationCode) { GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode) {
CodeBlock.Builder code = CodeBlock.builder(); CodeBlock.Builder code = CodeBlock.builder();
code.addStatement("return $L", BEAN_DEFINITION_VARIABLE); code.addStatement("return $L", BEAN_DEFINITION_VARIABLE);

View File

@ -782,7 +782,8 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
@Override @Override
public CodeBlock generateSetBeanDefinitionPropertiesCode(GenerationContext generationContext, public CodeBlock generateSetBeanDefinitionPropertiesCode(GenerationContext generationContext,
BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) { BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition,
Predicate<String> attributeFilter) {
CodeBlock.Builder code = CodeBlock.builder(); CodeBlock.Builder code = CodeBlock.builder();
code.add(super.generateSetBeanDefinitionPropertiesCode(generationContext, code.add(super.generateSetBeanDefinitionPropertiesCode(generationContext,
@ -803,7 +804,9 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
.generateCode(this.registeredBean, instantiationDescriptor); .generateCode(this.registeredBean, instantiationDescriptor);
} }
private InstantiationDescriptor proxyInstantiationDescriptor(RuntimeHints runtimeHints, InstantiationDescriptor instantiationDescriptor) { private InstantiationDescriptor proxyInstantiationDescriptor(
RuntimeHints runtimeHints, InstantiationDescriptor instantiationDescriptor) {
Executable userExecutable = instantiationDescriptor.executable(); Executable userExecutable = instantiationDescriptor.executable();
if (userExecutable instanceof Constructor<?> userConstructor) { if (userExecutable instanceof Constructor<?> userConstructor) {
try { try {