File tree Expand file tree Collapse file tree 7 files changed +52
-3
lines changed
main/java/org/springframework/beans/factory
test/java/org/springframework/beans/factory/support
spring-context/src/main/java/org/springframework
spring-test/src/main/java/org/springframework/test/web/servlet/setup Expand file tree Collapse file tree 7 files changed +52
-3
lines changed Original file line number Diff line number Diff line change 1919import org .jspecify .annotations .Nullable ;
2020
2121import org .springframework .beans .BeansException ;
22+ import org .springframework .core .ParameterizedTypeReference ;
2223import org .springframework .core .ResolvableType ;
2324
2425/**
@@ -264,6 +265,22 @@ public interface BeanFactory {
264265 */
265266 <T > ObjectProvider <T > getBeanProvider (ResolvableType requiredType );
266267
268+ /**
269+ * Return a provider for the specified bean, allowing for lazy on-demand retrieval
270+ * of instances, including availability and uniqueness options. This variant allows
271+ * for specifying a generic type to match, similar to reflective injection points
272+ * with generic type declarations in method/constructor parameters.
273+ * <p>This is a variant of {@link #getBeanProvider(ResolvableType)} with a
274+ * captured generic type for type-safe retrieval, typically used inline:
275+ * {@code getBeanProvider(new ParameterizedTypeReference<>() {})} - and
276+ * effectively equivalent to {@code getBeanProvider(ResolvableType.forType(...))}.
277+ * @return a corresponding provider handle
278+ * @param requiredType a captured generic type that the bean must match
279+ * @since 7.0
280+ * @see #getBeanProvider(ResolvableType)
281+ */
282+ <T > ObjectProvider <T > getBeanProvider (ParameterizedTypeReference <T > requiredType );
283+
267284 /**
268285 * Does this bean factory contain a bean definition or externally registered singleton
269286 * instance with the given name?
Original file line number Diff line number Diff line change 7878import org .springframework .core .NamedThreadLocal ;
7979import org .springframework .core .OrderComparator ;
8080import org .springframework .core .Ordered ;
81+ import org .springframework .core .ParameterizedTypeReference ;
8182import org .springframework .core .ResolvableType ;
8283import org .springframework .core .SpringProperties ;
8384import org .springframework .core .annotation .MergedAnnotation ;
@@ -398,6 +399,10 @@ public <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType) {
398399 return getBeanProvider (requiredType , true );
399400 }
400401
402+ public <T > ObjectProvider <T > getBeanProvider (ParameterizedTypeReference <T > requiredType ) {
403+ return getBeanProvider (ResolvableType .forType (requiredType ), true );
404+ }
405+
401406
402407 //---------------------------------------------------------------------
403408 // Implementation of ListableBeanFactory interface
Original file line number Diff line number Diff line change 3939import org .springframework .beans .factory .NoUniqueBeanDefinitionException ;
4040import org .springframework .beans .factory .ObjectProvider ;
4141import org .springframework .beans .factory .SmartFactoryBean ;
42+ import org .springframework .core .ParameterizedTypeReference ;
4243import org .springframework .core .ResolvableType ;
4344import org .springframework .core .annotation .AnnotatedElementUtils ;
4445import org .springframework .util .Assert ;
@@ -199,6 +200,11 @@ public <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType) {
199200 return getBeanProvider (requiredType , true );
200201 }
201202
203+ @ Override
204+ public <T > ObjectProvider <T > getBeanProvider (ParameterizedTypeReference <T > requiredType ) {
205+ return getBeanProvider (ResolvableType .forType (requiredType ), true );
206+ }
207+
202208 @ Override
203209 public boolean containsBean (String name ) {
204210 return this .beans .containsKey (name );
Original file line number Diff line number Diff line change 4545import org .springframework .beans .testfixture .beans .GenericSetOfIntegerBean ;
4646import org .springframework .beans .testfixture .beans .TestBean ;
4747import org .springframework .core .OverridingClassLoader ;
48+ import org .springframework .core .ParameterizedTypeReference ;
4849import org .springframework .core .ResolvableType ;
4950import org .springframework .core .annotation .AnnotationAwareOrderComparator ;
5051import org .springframework .core .annotation .Order ;
@@ -792,9 +793,9 @@ void genericMatchingWithFullTypeDifferentiation(Class<?> factoryClass) {
792793 assertThat (doubleStoreNames ).containsExactly ("store1" );
793794 assertThat (floatStoreNames ).containsExactly ("store2" );
794795
795- ObjectProvider <NumberStore <?>> numberStoreProvider = bf .getBeanProvider (ResolvableType . forClass ( NumberStore . class ) );
796- ObjectProvider <NumberStore <Double >> doubleStoreProvider = bf .getBeanProvider (ResolvableType . forClassWithGenerics ( NumberStore . class , Double . class ) );
797- ObjectProvider <NumberStore <Float >> floatStoreProvider = bf .getBeanProvider (ResolvableType . forClassWithGenerics ( NumberStore . class , Float . class ) );
796+ ObjectProvider <NumberStore <?>> numberStoreProvider = bf .getBeanProvider (new ParameterizedTypeReference <>() {} );
797+ ObjectProvider <NumberStore <Double >> doubleStoreProvider = bf .getBeanProvider (new ParameterizedTypeReference <>() {} );
798+ ObjectProvider <NumberStore <Float >> floatStoreProvider = bf .getBeanProvider (new ParameterizedTypeReference <>() {} );
798799 assertThatExceptionOfType (NoUniqueBeanDefinitionException .class ).isThrownBy (numberStoreProvider ::getObject );
799800 assertThatExceptionOfType (NoUniqueBeanDefinitionException .class ).isThrownBy (numberStoreProvider ::getIfAvailable );
800801 assertThat (numberStoreProvider .getIfUnique ()).isNull ();
Original file line number Diff line number Diff line change 7676import org .springframework .context .weaving .LoadTimeWeaverAware ;
7777import org .springframework .context .weaving .LoadTimeWeaverAwareProcessor ;
7878import org .springframework .core .NativeDetector ;
79+ import org .springframework .core .ParameterizedTypeReference ;
7980import org .springframework .core .ResolvableType ;
8081import org .springframework .core .annotation .AnnotationUtils ;
8182import org .springframework .core .convert .ConversionService ;
@@ -1303,6 +1304,12 @@ public <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType) {
13031304 return getBeanFactory ().getBeanProvider (requiredType );
13041305 }
13051306
1307+ @ Override
1308+ public <T > ObjectProvider <T > getBeanProvider (ParameterizedTypeReference <T > requiredType ) {
1309+ assertBeanFactoryActive ();
1310+ return getBeanFactory ().getBeanProvider (requiredType );
1311+ }
1312+
13061313 @ Override
13071314 public boolean containsBean (String name ) {
13081315 return getBeanFactory ().containsBean (name );
Original file line number Diff line number Diff line change 3434import org .springframework .beans .factory .NoSuchBeanDefinitionException ;
3535import org .springframework .beans .factory .NoUniqueBeanDefinitionException ;
3636import org .springframework .beans .factory .ObjectProvider ;
37+ import org .springframework .core .ParameterizedTypeReference ;
3738import org .springframework .core .ResolvableType ;
3839import org .springframework .jndi .JndiLocatorSupport ;
3940import org .springframework .jndi .TypeMismatchNamingException ;
@@ -195,6 +196,12 @@ public <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType) {
195196 "SimpleJndiBeanFactory does not support resolution by ResolvableType" );
196197 }
197198
199+ @ Override
200+ public <T > ObjectProvider <T > getBeanProvider (ParameterizedTypeReference <T > requiredType ) {
201+ throw new UnsupportedOperationException (
202+ "SimpleJndiBeanFactory does not support resolution by ParameterizedTypeReference" );
203+ }
204+
198205 @ Override
199206 public boolean containsBean (String name ) {
200207 if (this .singletonObjects .containsKey (name ) || this .resourceTypes .containsKey (name )) {
Original file line number Diff line number Diff line change 4343import org .springframework .context .MessageSourceResolvable ;
4444import org .springframework .context .NoSuchMessageException ;
4545import org .springframework .context .support .DelegatingMessageSource ;
46+ import org .springframework .core .ParameterizedTypeReference ;
4647import org .springframework .core .ResolvableType ;
4748import org .springframework .core .env .Environment ;
4849import org .springframework .core .env .StandardEnvironment ;
@@ -192,6 +193,11 @@ public <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType) {
192193 return this .beanFactory .getBeanProvider (requiredType );
193194 }
194195
196+ @ Override
197+ public <T > ObjectProvider <T > getBeanProvider (ParameterizedTypeReference <T > requiredType ) {
198+ return this .beanFactory .getBeanProvider (requiredType );
199+ }
200+
195201 @ Override
196202 public boolean containsBean (String name ) {
197203 return this .beanFactory .containsBean (name );
You can’t perform that action at this time.
0 commit comments