29
29
import java .util .Set ;
30
30
31
31
import org .junit .jupiter .api .Test ;
32
+ import org .junit .jupiter .params .ParameterizedTest ;
33
+ import org .junit .jupiter .params .provider .ValueSource ;
32
34
import org .mockito .Mockito ;
33
35
34
36
import org .springframework .beans .factory .BeanCreationException ;
@@ -756,25 +758,31 @@ void genericMatchingWithBeanNameDifferentiation() {
756
758
assertThat (floatStoreNames ).isEmpty ();
757
759
}
758
760
759
- @ Test
760
- void genericMatchingWithFullTypeDifferentiation () {
761
+ @ ParameterizedTest
762
+ @ ValueSource (classes = {NumberStoreFactory .class , NumberStoreFactoryBeans .class })
763
+ void genericMatchingWithFullTypeDifferentiation (Class <?> factoryClass ) {
761
764
DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
762
765
bf .setDependencyComparator (AnnotationAwareOrderComparator .INSTANCE );
763
766
bf .setAutowireCandidateResolver (new GenericTypeAwareAutowireCandidateResolver ());
764
767
765
- RootBeanDefinition bd1 = new RootBeanDefinition (NumberStoreFactory . class );
768
+ RootBeanDefinition bd1 = new RootBeanDefinition (factoryClass );
766
769
bd1 .setFactoryMethodName ("newDoubleStore" );
767
770
bf .registerBeanDefinition ("store1" , bd1 );
768
- RootBeanDefinition bd2 = new RootBeanDefinition (NumberStoreFactory . class );
771
+ RootBeanDefinition bd2 = new RootBeanDefinition (factoryClass );
769
772
bd2 .setFactoryMethodName ("newFloatStore" );
770
773
bf .registerBeanDefinition ("store2" , bd2 );
771
- bf .registerBeanDefinition ("numberBean" ,
772
- new RootBeanDefinition (NumberBean .class , RootBeanDefinition .AUTOWIRE_CONSTRUCTOR , false ));
774
+ RootBeanDefinition bd3 = new RootBeanDefinition (NumberBean .class );
775
+ bd3 .setScope (RootBeanDefinition .SCOPE_PROTOTYPE );
776
+ bd3 .setAutowireMode (RootBeanDefinition .AUTOWIRE_CONSTRUCTOR );
777
+ bf .registerBeanDefinition ("numberBean" , bd3 );
773
778
774
- NumberBean nb = bf .getBean (NumberBean .class );
775
779
NumberStore <?> store1 = bf .getBean ("store1" , NumberStore .class );
776
- assertThat (nb .getDoubleStore ()).isSameAs (store1 );
777
780
NumberStore <?> store2 = bf .getBean ("store2" , NumberStore .class );
781
+ NumberBean nb = bf .getBean (NumberBean .class );
782
+ assertThat (nb .getDoubleStore ()).isSameAs (store1 );
783
+ assertThat (nb .getFloatStore ()).isSameAs (store2 );
784
+ nb = bf .getBean (NumberBean .class );
785
+ assertThat (nb .getDoubleStore ()).isSameAs (store1 );
778
786
assertThat (nb .getFloatStore ()).isSameAs (store2 );
779
787
780
788
String [] numberStoreNames = bf .getBeanNamesForType (ResolvableType .forClass (NumberStore .class ));
@@ -822,16 +830,17 @@ void genericMatchingWithFullTypeDifferentiation() {
822
830
assertThat (floatStoreProvider .orderedStream ()).singleElement ().isEqualTo (store2 );
823
831
}
824
832
825
- @ Test
826
- void genericMatchingWithUnresolvedOrderedStream () {
833
+ @ ParameterizedTest
834
+ @ ValueSource (classes = {NumberStoreFactory .class , NumberStoreFactoryBeans .class })
835
+ void genericMatchingWithUnresolvedOrderedStream (Class <?> factoryClass ) {
827
836
DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
828
837
bf .setDependencyComparator (AnnotationAwareOrderComparator .INSTANCE );
829
838
bf .setAutowireCandidateResolver (new GenericTypeAwareAutowireCandidateResolver ());
830
839
831
- RootBeanDefinition bd1 = new RootBeanDefinition (NumberStoreFactory . class );
840
+ RootBeanDefinition bd1 = new RootBeanDefinition (factoryClass );
832
841
bd1 .setFactoryMethodName ("newDoubleStore" );
833
842
bf .registerBeanDefinition ("store1" , bd1 );
834
- RootBeanDefinition bd2 = new RootBeanDefinition (NumberStoreFactory . class );
843
+ RootBeanDefinition bd2 = new RootBeanDefinition (factoryClass );
835
844
bd2 .setFactoryMethodName ("newFloatStore" );
836
845
bf .registerBeanDefinition ("store2" , bd2 );
837
846
@@ -854,7 +863,22 @@ void genericMatchingAgainstFactoryBeanClass() {
854
863
bf .registerBeanDefinition ("myFactoryBeanHolder" ,
855
864
new RootBeanDefinition (MyFactoryBeanHolder .class , AbstractBeanDefinition .AUTOWIRE_CONSTRUCTOR , false ));
856
865
857
- assertThat (bf .getBean (MyFactoryBeanHolder .class ).factoryBeans ).contains (bf .getBean (MyFactoryBean .class ));
866
+ assertThat (bf .getBean (MyFactoryBeanHolder .class ).factoryBeans ).containsOnly (bf .getBean (MyFactoryBean .class ));
867
+ }
868
+
869
+ @ Test // gh-32489
870
+ void genericMatchingAgainstLazyFactoryBeanClass () {
871
+ DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
872
+ bf .setAutowireCandidateResolver (new GenericTypeAwareAutowireCandidateResolver ());
873
+
874
+ RootBeanDefinition bd = new RootBeanDefinition (MyFactoryBean .class );
875
+ bd .setTargetType (ResolvableType .forClassWithGenerics (MyFactoryBean .class , String .class ));
876
+ bd .setLazyInit (true );
877
+ bf .registerBeanDefinition ("myFactoryBean" , bd );
878
+ bf .registerBeanDefinition ("myFactoryBeanHolder" ,
879
+ new RootBeanDefinition (MyFactoryBeanHolder .class , AbstractBeanDefinition .AUTOWIRE_CONSTRUCTOR , false ));
880
+
881
+ assertThat (bf .getBean (MyFactoryBeanHolder .class ).factoryBeans ).containsOnly (bf .getBean (MyFactoryBean .class ));
858
882
}
859
883
860
884
@@ -974,6 +998,38 @@ public static NumberStore<Float> newFloatStore() {
974
998
}
975
999
976
1000
1001
+ public static class NumberStoreFactoryBeans {
1002
+
1003
+ @ Order (1 )
1004
+ public static FactoryBean <NumberStore <Double >> newDoubleStore () {
1005
+ return new FactoryBean <>() {
1006
+ @ Override
1007
+ public NumberStore <Double > getObject () {
1008
+ return new DoubleStore ();
1009
+ }
1010
+ @ Override
1011
+ public Class <?> getObjectType () {
1012
+ return DoubleStore .class ;
1013
+ }
1014
+ };
1015
+ }
1016
+
1017
+ @ Order (0 )
1018
+ public static FactoryBean <NumberStore <Float >> newFloatStore () {
1019
+ return new FactoryBean <>() {
1020
+ @ Override
1021
+ public NumberStore <Float > getObject () {
1022
+ return new FloatStore ();
1023
+ }
1024
+ @ Override
1025
+ public Class <?> getObjectType () {
1026
+ return FloatStore .class ;
1027
+ }
1028
+ };
1029
+ }
1030
+ }
1031
+
1032
+
977
1033
public interface MyGenericInterfaceForFactoryBeans <T > {
978
1034
}
979
1035
0 commit comments