43
43
import org .springframework .aot .generate .GeneratedMethod ;
44
44
import org .springframework .aot .generate .GeneratedMethods ;
45
45
import org .springframework .aot .generate .GenerationContext ;
46
+ import org .springframework .aot .generate .MethodReference .ArgumentCodeGenerator ;
46
47
import org .springframework .aot .hint .RuntimeHints ;
47
48
import org .springframework .beans .BeanUtils ;
48
49
import org .springframework .beans .PropertyValues ;
@@ -769,11 +770,11 @@ private static class AotContribution implements BeanRegistrationAotContribution
769
770
770
771
private final Class <?> target ;
771
772
772
- private final Collection <InjectedElement > injectedElements ;
773
+ private final List <InjectedElement > injectedElements ;
773
774
774
775
AotContribution (Class <?> target , Collection <InjectedElement > injectedElements ) {
775
776
this .target = target ;
776
- this .injectedElements = injectedElements ;
777
+ this .injectedElements = List . copyOf ( injectedElements ) ;
777
778
}
778
779
779
780
@ Override
@@ -797,19 +798,47 @@ public void applyTo(GenerationContext generationContext, BeanRegistrationCode be
797
798
798
799
private CodeBlock generateMethodCode (RuntimeHints hints , GeneratedClass generatedClass ) {
799
800
CodeBlock .Builder code = CodeBlock .builder ();
800
- InjectionCodeGenerator injectionCodeGenerator =
801
- new InjectionCodeGenerator (generatedClass .getName (), hints );
802
- for (InjectedElement injectedElement : this .injectedElements ) {
803
- CodeBlock resourceToInject = generateResourceToInjectCode (generatedClass .getMethods (),
804
- (PersistenceElement ) injectedElement );
805
- code .add (injectionCodeGenerator .generateInjectionCode (
806
- injectedElement .getMember (), INSTANCE_PARAMETER ,
807
- resourceToInject ));
801
+ if (this .injectedElements .size () == 1 ) {
802
+ code .add (generateInjectedElementMethodCode (hints , generatedClass , this .injectedElements .get (0 )));
803
+ }
804
+ else {
805
+ for (InjectedElement injectedElement : this .injectedElements ) {
806
+ code .addStatement (applyInjectedElement (hints , generatedClass , injectedElement ));
807
+ }
808
808
}
809
809
code .addStatement ("return $L" , INSTANCE_PARAMETER );
810
810
return code .build ();
811
811
}
812
812
813
+ private CodeBlock applyInjectedElement (RuntimeHints hints , GeneratedClass generatedClass , InjectedElement injectedElement ) {
814
+ String injectedElementName = injectedElement .getMember ().getName ();
815
+ GeneratedMethod generatedMethod = generatedClass .getMethods ().add (new String [] { "apply" , injectedElementName }, method -> {
816
+ method .addJavadoc ("Apply the persistence injection for '$L'." , injectedElementName );
817
+ method .addModifiers (javax .lang .model .element .Modifier .PRIVATE ,
818
+ javax .lang .model .element .Modifier .STATIC );
819
+ method .addParameter (RegisteredBean .class , REGISTERED_BEAN_PARAMETER );
820
+ method .addParameter (this .target , INSTANCE_PARAMETER );
821
+ method .addCode (generateInjectedElementMethodCode (hints , generatedClass , injectedElement ));
822
+ });
823
+ ArgumentCodeGenerator argumentCodeGenerator = ArgumentCodeGenerator
824
+ .of (RegisteredBean .class , REGISTERED_BEAN_PARAMETER ).and (this .target , INSTANCE_PARAMETER );
825
+ return generatedMethod .toMethodReference ().toInvokeCodeBlock (argumentCodeGenerator , generatedClass .getName ());
826
+ }
827
+
828
+ private CodeBlock generateInjectedElementMethodCode (RuntimeHints hints , GeneratedClass generatedClass ,
829
+ InjectedElement injectedElement ) {
830
+
831
+ CodeBlock .Builder code = CodeBlock .builder ();
832
+ InjectionCodeGenerator injectionCodeGenerator =
833
+ new InjectionCodeGenerator (generatedClass .getName (), hints );
834
+ CodeBlock resourceToInject = generateResourceToInjectCode (generatedClass .getMethods (),
835
+ (PersistenceElement ) injectedElement );
836
+ code .add (injectionCodeGenerator .generateInjectionCode (
837
+ injectedElement .getMember (), INSTANCE_PARAMETER ,
838
+ resourceToInject ));
839
+ return code .build ();
840
+ }
841
+
813
842
private CodeBlock generateResourceToInjectCode (
814
843
GeneratedMethods generatedMethods , PersistenceElement injectedElement ) {
815
844
@@ -821,7 +850,7 @@ private CodeBlock generateResourceToInjectCode(
821
850
EntityManagerFactoryUtils .class , ListableBeanFactory .class ,
822
851
REGISTERED_BEAN_PARAMETER , unitName );
823
852
}
824
- String [] methodNameParts = {"get" , unitName , "EntityManager" };
853
+ String [] methodNameParts = { "get" , unitName , "EntityManager" };
825
854
GeneratedMethod generatedMethod = generatedMethods .add (methodNameParts , method ->
826
855
generateGetEntityManagerMethod (method , injectedElement ));
827
856
return CodeBlock .of ("$L($L)" , generatedMethod .getName (), REGISTERED_BEAN_PARAMETER );
0 commit comments