@@ -113,15 +113,8 @@ public void addBean(String name, Object bean) {
113
113
@ Override
114
114
public Object getBean (String name ) throws BeansException {
115
115
String beanName = BeanFactoryUtils .transformedBeanName (name );
116
- Object bean = this . beans . get (beanName );
116
+ Object bean = obtainBean (beanName );
117
117
118
- if (bean == null ) {
119
- throw new NoSuchBeanDefinitionException (beanName ,
120
- "Defined beans are [" + StringUtils .collectionToCommaDelimitedString (this .beans .keySet ()) + "]" );
121
- }
122
-
123
- // Don't let calling code try to dereference the
124
- // bean factory if the bean isn't a factory
125
118
if (BeanFactoryUtils .isFactoryDereference (name ) && !(bean instanceof FactoryBean )) {
126
119
throw new BeanIsNotAFactoryException (beanName , bean .getClass ());
127
120
}
@@ -162,6 +155,15 @@ public Object getBean(String name, Object... args) throws BeansException {
162
155
return getBean (name );
163
156
}
164
157
158
+ private Object obtainBean (String beanName ) {
159
+ Object bean = this .beans .get (beanName );
160
+ if (bean == null ) {
161
+ throw new NoSuchBeanDefinitionException (beanName ,
162
+ "Defined beans are [" + StringUtils .collectionToCommaDelimitedString (this .beans .keySet ()) + "]" );
163
+ }
164
+ return bean ;
165
+ }
166
+
165
167
@ Override
166
168
public <T > T getBean (Class <T > requiredType ) throws BeansException {
167
169
String [] beanNames = getBeanNamesForType (requiredType );
@@ -202,20 +204,21 @@ public boolean containsBean(String name) {
202
204
203
205
@ Override
204
206
public boolean isSingleton (String name ) throws NoSuchBeanDefinitionException {
205
- Object bean = getBean (name );
206
- // In case of FactoryBean, return singleton status of created object.
207
- if (bean instanceof FactoryBean <?> factoryBean ) {
207
+ String beanName = BeanFactoryUtils . transformedBeanName (name );
208
+ Object bean = obtainBean ( beanName );
209
+ if (bean instanceof FactoryBean <?> factoryBean && ! BeanFactoryUtils . isFactoryDereference ( name ) ) {
208
210
return factoryBean .isSingleton ();
209
211
}
210
212
return true ;
211
213
}
212
214
213
215
@ Override
214
216
public boolean isPrototype (String name ) throws NoSuchBeanDefinitionException {
215
- Object bean = getBean (name );
216
- // In case of FactoryBean, return prototype status of created object.
217
- return ((bean instanceof SmartFactoryBean <?> smartFactoryBean && smartFactoryBean .isPrototype ()) ||
218
- (bean instanceof FactoryBean <?> factoryBean && !factoryBean .isSingleton ()));
217
+ String beanName = BeanFactoryUtils .transformedBeanName (name );
218
+ Object bean = obtainBean (beanName );
219
+ return (!BeanFactoryUtils .isFactoryDereference (name ) &&
220
+ ((bean instanceof SmartFactoryBean <?> smartFactoryBean && smartFactoryBean .isPrototype ()) ||
221
+ (bean instanceof FactoryBean <?> factoryBean && !factoryBean .isSingleton ())));
219
222
}
220
223
221
224
@ Override
@@ -240,15 +243,8 @@ public Class<?> getType(String name) throws NoSuchBeanDefinitionException {
240
243
@ Nullable
241
244
public Class <?> getType (String name , boolean allowFactoryBeanInit ) throws NoSuchBeanDefinitionException {
242
245
String beanName = BeanFactoryUtils .transformedBeanName (name );
243
-
244
- Object bean = this .beans .get (beanName );
245
- if (bean == null ) {
246
- throw new NoSuchBeanDefinitionException (beanName ,
247
- "Defined beans are [" + StringUtils .collectionToCommaDelimitedString (this .beans .keySet ()) + "]" );
248
- }
249
-
246
+ Object bean = obtainBean (beanName );
250
247
if (bean instanceof FactoryBean <?> factoryBean && !BeanFactoryUtils .isFactoryDereference (name )) {
251
- // If it's a FactoryBean, we want to look at what it creates, not the factory class.
252
248
return factoryBean .getObjectType ();
253
249
}
254
250
return bean .getClass ();
@@ -292,7 +288,7 @@ public <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType, boolea
292
288
public T getObject () throws BeansException {
293
289
String [] beanNames = getBeanNamesForType (requiredType );
294
290
if (beanNames .length == 1 ) {
295
- return (T ) getBean (beanNames [0 ], requiredType );
291
+ return (T ) getBean (beanNames [0 ]);
296
292
}
297
293
else if (beanNames .length > 1 ) {
298
294
throw new NoUniqueBeanDefinitionException (requiredType , beanNames );
@@ -356,7 +352,7 @@ public String[] getBeanNamesForType(@Nullable ResolvableType type,
356
352
boolean includeNonSingletons , boolean allowEagerInit ) {
357
353
358
354
Class <?> resolved = (type != null ? type .resolve () : null );
359
- boolean isFactoryType = resolved != null && FactoryBean .class .isAssignableFrom (resolved );
355
+ boolean isFactoryType = ( resolved != null && FactoryBean .class .isAssignableFrom (resolved ) );
360
356
List <String > matches = new ArrayList <>();
361
357
362
358
for (Map .Entry <String , Object > entry : this .beans .entrySet ()) {
@@ -365,7 +361,7 @@ public String[] getBeanNamesForType(@Nullable ResolvableType type,
365
361
if (beanInstance instanceof FactoryBean <?> factoryBean && !isFactoryType ) {
366
362
Class <?> objectType = factoryBean .getObjectType ();
367
363
if ((includeNonSingletons || factoryBean .isSingleton ()) &&
368
- objectType != null && ( type == null || type .isAssignableFrom (objectType ))) {
364
+ ( type == null || ( objectType != null && type .isAssignableFrom (objectType ) ))) {
369
365
matches .add (beanName );
370
366
}
371
367
}
@@ -404,19 +400,15 @@ public <T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includ
404
400
for (Map .Entry <String , Object > entry : this .beans .entrySet ()) {
405
401
String beanName = entry .getKey ();
406
402
Object beanInstance = entry .getValue ();
407
- // Is bean a FactoryBean?
408
403
if (beanInstance instanceof FactoryBean <?> factoryBean && !isFactoryType ) {
409
- // Match object created by FactoryBean.
410
404
Class <?> objectType = factoryBean .getObjectType ();
411
405
if ((includeNonSingletons || factoryBean .isSingleton ()) &&
412
- objectType != null && ( type == null || type .isAssignableFrom (objectType ))) {
406
+ ( type == null || ( objectType != null && type .isAssignableFrom (objectType ) ))) {
413
407
matches .put (beanName , getBean (beanName , type ));
414
408
}
415
409
}
416
410
else {
417
411
if (type == null || type .isInstance (beanInstance )) {
418
- // If type to match is FactoryBean, return FactoryBean itself.
419
- // Else, return bean instance.
420
412
if (isFactoryType ) {
421
413
beanName = FACTORY_BEAN_PREFIX + beanName ;
422
414
}
0 commit comments