|
|
|
@ -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); |
|
|
|
|