Top Description Inners Fields Constructors Methods
org.springframework.beans.factory.aot

public Class InstanceSupplierCodeGenerator

extends Object
Class Inheritance
Imports
java.lang.reflect.Constructor, .Executable, .Member, .Method, .Modifier, .Parameter, .Proxy, java.util.Arrays, java.util.function.Consumer, kotlin.jvm.JvmClassMappingKt, kotlin.reflect.KClass, kotlin.reflect.KFunction, kotlin.reflect.KParameter, org.springframework.aot.generate.AccessControl, .AccessControl.Visibility, .GeneratedMethod, .GeneratedMethods, .GenerationContext, .MethodReference.ArgumentCodeGenerator, org.springframework.aot.hint.ExecutableMode, .MemberCategory, .ReflectionHints, .RuntimeHints, org.springframework.beans.factory.config.DependencyDescriptor, org.springframework.beans.factory.support.AutowireCandidateResolver, .DefaultListableBeanFactory, .InstanceSupplier, .RegisteredBean, org.springframework.core.KotlinDetector, .MethodParameter, .ResolvableType, org.springframework.javapoet.ClassName, .CodeBlock, .CodeBlock.Builder, .MethodSpec, .ParameterizedTypeName, org.springframework.util.ClassUtils, org.springframework.util.function.ThrowingSupplier

Default code generator to create an InstanceSupplier, usually in the form of a BeanInstanceSupplier that retains the executable that is used to instantiate the bean. Takes care of registering the necessary hints if reflection or a JDK proxy is required.

Generated code is usually a method reference that generates the BeanInstanceSupplier, but some shortcut can be used as well such as:

InstanceSupplier.of(TheGeneratedClass::getMyBeanInstance);
Authors
Phillip Webb, Stephane Nicoll, Juergen Hoeller, Sebastien Deleuze
Since
6.0
See Also
BeanRegistrationCodeFragments

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class
InstanceSupplierCodeGenerator.KotlinDelegate

Inner class to avoid a hard dependency on Kotlin at runtime.

private static class

Field Summary

Modifier and TypeField and Description
private final boolean
private static final String
private final ClassName
private final GeneratedMethods
private final GenerationContext
private static final CodeBlock
private static final Modifier[]
private static final String

Constructor Summary

AccessConstructor and Description
public
InstanceSupplierCodeGenerator(GenerationContext
the generation context
generationContext
,
ClassName
the class name of the bean to instantiate
className
,
GeneratedMethods
the generated methods
generatedMethods
,
boolean
whether a direct supplier may be used rather than always needing an InstanceSupplier
allowDirectSupplierShortcut
)

Create a new instance.

Method Summary

Modifier and TypeMethod and Description
private void
buildGetInstanceMethodForConstructor(MethodSpec.Builder method, String beanName, Class<?> beanClass, Constructor<?> constructor, Class<?> declaringClass, boolean dependsOnBean, Modifier... modifiers)

private void
buildGetInstanceMethodForFactoryMethod(MethodSpec.Builder method, String beanName, Method factoryMethod, Class<?> declaringClass, boolean dependsOnBean, Modifier... modifiers)

public CodeBlock

Returns:

the generated code
generateCode
(RegisteredBean
the bean to handle
registeredBean
,
Executable
the executable to use to create the bean
constructorOrFactoryMethod
)

Generate the instance supplier code.

private CodeBlock
generateCodeForAccessibleConstructor(String beanName, Class<?> beanClass, Constructor<?> constructor, boolean dependsOnBean, Class<?> declaringClass)

private CodeBlock
generateCodeForAccessibleFactoryMethod(String beanName, Method factoryMethod, Class<?> declaringClass, boolean dependsOnBean)

private CodeBlock
generateCodeForConstructor(RegisteredBean registeredBean, Constructor<?> constructor)

private CodeBlock
generateCodeForFactoryMethod(RegisteredBean registeredBean, Method factoryMethod)

private CodeBlock
generateCodeForInaccessibleConstructor(String beanName, Class<?> beanClass, Constructor<?> constructor, boolean dependsOnBean, Consumer<ReflectionHints> hints)

private CodeBlock
generateCodeForInaccessibleFactoryMethod(String beanName, Method factoryMethod, Class<?> declaringClass)

private GeneratedMethod
private CodeBlock
generateInstanceSupplierForFactoryMethod(Method factoryMethod, Class<?> suppliedType, Class<?> declaringClass, String factoryMethodName)

private CodeBlock
generateNewInstanceCodeForConstructor(boolean dependsOnBean, Class<?> declaringClass, CodeBlock args)

private CodeBlock
generateNewInstanceCodeForMethod(boolean dependsOnBean, Class<?> declaringClass, String factoryMethodName, CodeBlock args)

private CodeBlock
generateParameterTypesCode(Class<?>[] parameterTypes, int offset)

private CodeBlock
generateResolverForConstructor(Class<?> beanClass, Constructor<?> constructor, int parameterOffset)

private CodeBlock
private CodeBlock
generateWithGeneratorCode(boolean hasArguments, CodeBlock newInstance)

private AccessControl.Visibility
getAccessVisibility(RegisteredBean registeredBean, Member member)

private boolean
private void
registerRuntimeHintsIfNecessary(RegisteredBean registeredBean, Executable constructorOrFactoryMethod)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

allowDirectSupplierShortcutback to summary
private final boolean allowDirectSupplierShortcut
ARGS_PARAMETER_NAMEback to summary
private static final String ARGS_PARAMETER_NAME
classNameback to summary
private final ClassName className
generatedMethodsback to summary
private final GeneratedMethods generatedMethods
generationContextback to summary
private final GenerationContext generationContext
NO_ARGSback to summary
private static final CodeBlock NO_ARGS
PRIVATE_STATICback to summary
private static final Modifier[] PRIVATE_STATIC
REGISTERED_BEAN_PARAMETER_NAMEback to summary
private static final String REGISTERED_BEAN_PARAMETER_NAME

Constructor Detail

InstanceSupplierCodeGeneratorback to summary
public InstanceSupplierCodeGenerator(GenerationContext generationContext, ClassName className, GeneratedMethods generatedMethods, boolean allowDirectSupplierShortcut)

Create a new instance.

Parameters
generationContext:GenerationContext

the generation context

className:ClassName

the class name of the bean to instantiate

generatedMethods:GeneratedMethods

the generated methods

allowDirectSupplierShortcut:boolean

whether a direct supplier may be used rather than always needing an InstanceSupplier

Method Detail

buildGetInstanceMethodForConstructorback to summary
private void buildGetInstanceMethodForConstructor(MethodSpec.Builder method, String beanName, Class<?> beanClass, Constructor<?> constructor, Class<?> declaringClass, boolean dependsOnBean, Modifier... modifiers)
buildGetInstanceMethodForFactoryMethodback to summary
private void buildGetInstanceMethodForFactoryMethod(MethodSpec.Builder method, String beanName, Method factoryMethod, Class<?> declaringClass, boolean dependsOnBean, Modifier... modifiers)
generateCodeback to summary
public CodeBlock generateCode(RegisteredBean registeredBean, Executable constructorOrFactoryMethod)

Generate the instance supplier code.

Parameters
registeredBean:RegisteredBean

the bean to handle

constructorOrFactoryMethod:Executable

the executable to use to create the bean

Returns:CodeBlock

the generated code

generateCodeForAccessibleConstructorback to summary
private CodeBlock generateCodeForAccessibleConstructor(String beanName, Class<?> beanClass, Constructor<?> constructor, boolean dependsOnBean, Class<?> declaringClass)
generateCodeForAccessibleFactoryMethodback to summary
private CodeBlock generateCodeForAccessibleFactoryMethod(String beanName, Method factoryMethod, Class<?> declaringClass, boolean dependsOnBean)
generateCodeForConstructorback to summary
private CodeBlock generateCodeForConstructor(RegisteredBean registeredBean, Constructor<?> constructor)
generateCodeForFactoryMethodback to summary
private CodeBlock generateCodeForFactoryMethod(RegisteredBean registeredBean, Method factoryMethod)
generateCodeForInaccessibleConstructorback to summary
private CodeBlock generateCodeForInaccessibleConstructor(String beanName, Class<?> beanClass, Constructor<?> constructor, boolean dependsOnBean, Consumer<ReflectionHints> hints)
generateCodeForInaccessibleFactoryMethodback to summary
private CodeBlock generateCodeForInaccessibleFactoryMethod(String beanName, Method factoryMethod, Class<?> declaringClass)
generateGetInstanceSupplierMethodback to summary
private GeneratedMethod generateGetInstanceSupplierMethod(Consumer<MethodSpec.Builder> method)
generateInstanceSupplierForFactoryMethodback to summary
private CodeBlock generateInstanceSupplierForFactoryMethod(Method factoryMethod, Class<?> suppliedType, Class<?> declaringClass, String factoryMethodName)
generateNewInstanceCodeForConstructorback to summary
private CodeBlock generateNewInstanceCodeForConstructor(boolean dependsOnBean, Class<?> declaringClass, CodeBlock args)
generateNewInstanceCodeForMethodback to summary
private CodeBlock generateNewInstanceCodeForMethod(boolean dependsOnBean, Class<?> declaringClass, String factoryMethodName, CodeBlock args)
generateParameterTypesCodeback to summary
private CodeBlock generateParameterTypesCode(Class<?>[] parameterTypes, int offset)
generateResolverForConstructorback to summary
private CodeBlock generateResolverForConstructor(Class<?> beanClass, Constructor<?> constructor, int parameterOffset)
generateReturnStatementback to summary
private CodeBlock generateReturnStatement(GeneratedMethod generatedMethod)
generateWithGeneratorCodeback to summary
private CodeBlock generateWithGeneratorCode(boolean hasArguments, CodeBlock newInstance)
getAccessVisibilityback to summary
private AccessControl.Visibility getAccessVisibility(RegisteredBean registeredBean, Member member)
isThrowingCheckedExceptionback to summary
private boolean isThrowingCheckedException(Executable executable)
registerRuntimeHintsIfNecessaryback to summary
private void registerRuntimeHintsIfNecessary(RegisteredBean registeredBean, Executable constructorOrFactoryMethod)
org.springframework.beans.factory.aot back to summary

private Class InstanceSupplierCodeGenerator.KotlinDelegate

extends Object
Class Inheritance
  • java.lang.Object
  • org.springframework.beans.factory.aot.InstanceSupplierCodeGenerator.KotlinDelegate

Inner class to avoid a hard dependency on Kotlin at runtime.

Constructor Summary

AccessConstructor and Description
private

Method Summary

Modifier and TypeMethod and Description
public static boolean
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Constructor Detail

KotlinDelegateback to summary
private KotlinDelegate()

Method Detail

hasConstructorWithOptionalParameterback to summary
public static boolean hasConstructorWithOptionalParameter(Class<?> beanClass)
org.springframework.beans.factory.aot back to summary

private Class InstanceSupplierCodeGenerator.ProxyRuntimeHintsRegistrar

extends Object
Class Inheritance
  • java.lang.Object
  • org.springframework.beans.factory.aot.InstanceSupplierCodeGenerator.ProxyRuntimeHintsRegistrar

Field Summary

Modifier and TypeField and Description
private final AutowireCandidateResolver

Constructor Summary

AccessConstructor and Description
public

Method Summary

Modifier and TypeMethod and Description
private void
registerProxyIfNecessary(RuntimeHints runtimeHints, DependencyDescriptor dependencyDescriptor)

public void
public void
registerRuntimeHints(RuntimeHints runtimeHints, Constructor<?> constructor)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

candidateResolverback to summary
private final AutowireCandidateResolver candidateResolver

Constructor Detail

ProxyRuntimeHintsRegistrarback to summary
public ProxyRuntimeHintsRegistrar(AutowireCandidateResolver candidateResolver)

Method Detail

registerProxyIfNecessaryback to summary
private void registerProxyIfNecessary(RuntimeHints runtimeHints, DependencyDescriptor dependencyDescriptor)
registerRuntimeHintsback to summary
public void registerRuntimeHints(RuntimeHints runtimeHints, Method method)
registerRuntimeHintsback to summary
public void registerRuntimeHints(RuntimeHints runtimeHints, Constructor<?> constructor)