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