|
23 | 23 | import java.util.Map;
|
24 | 24 | import java.util.Properties;
|
25 | 25 | import java.util.Set;
|
| 26 | +import java.util.function.BiFunction; |
26 | 27 |
|
27 | 28 | import org.springframework.beans.BeanWrapper;
|
28 | 29 | import org.springframework.beans.BeanWrapperImpl;
|
|
57 | 58 | *
|
58 | 59 | * @author Juergen Hoeller
|
59 | 60 | * @author Sam Brannen
|
| 61 | + * @author Stephane Nicoll |
60 | 62 | * @since 1.2
|
61 | 63 | * @see AbstractAutowireCapableBeanFactory
|
62 | 64 | */
|
@@ -143,13 +145,12 @@ else if (value instanceof RuntimeBeanNameReference ref) {
|
143 | 145 | }
|
144 | 146 | else if (value instanceof BeanDefinitionHolder bdHolder) {
|
145 | 147 | // Resolve BeanDefinitionHolder: contains BeanDefinition with name and aliases.
|
146 |
| - return resolveInnerBean(argName, bdHolder.getBeanName(), bdHolder.getBeanDefinition()); |
| 148 | + return resolveInnerBean(bdHolder.getBeanName(), bdHolder.getBeanDefinition(), |
| 149 | + (name, mbd) -> resolveInnerBeanValue(argName, name, mbd)); |
147 | 150 | }
|
148 | 151 | else if (value instanceof BeanDefinition bd) {
|
149 |
| - // Resolve plain BeanDefinition, without contained name: use dummy name. |
150 |
| - String innerBeanName = "(inner bean)" + BeanFactoryUtils.GENERATED_BEAN_NAME_SEPARATOR + |
151 |
| - ObjectUtils.getIdentityHexString(bd); |
152 |
| - return resolveInnerBean(argName, innerBeanName, bd); |
| 152 | + return resolveInnerBean(null, bd, |
| 153 | + (name, mbd) -> resolveInnerBeanValue(argName, name, mbd)); |
153 | 154 | }
|
154 | 155 | else if (value instanceof DependencyDescriptor dependencyDescriptor) {
|
155 | 156 | Set<String> autowiredBeanNames = new LinkedHashSet<>(4);
|
@@ -243,6 +244,23 @@ else if (value instanceof NullBean) {
|
243 | 244 | }
|
244 | 245 | }
|
245 | 246 |
|
| 247 | + /** |
| 248 | + * Resolve an inner bean definition and invoke the specified {@code resolver} |
| 249 | + * on its merged bean definition. |
| 250 | + * @param innerBeanName the inner bean name (or {@code null} to assign one) |
| 251 | + * @param innerBd the inner raw bean definition |
| 252 | + * @param resolver the function to invoke to resolve |
| 253 | + * @param <T> the type of the resolution |
| 254 | + * @return a resolved inner bean, as a result of applying the {@code resolver} |
| 255 | + */ |
| 256 | + public <T> T resolveInnerBean(@Nullable String innerBeanName, BeanDefinition innerBd, |
| 257 | + BiFunction<String, RootBeanDefinition, T> resolver) { |
| 258 | + String nameToUse = (innerBeanName != null ? innerBeanName : "(inner bean)" |
| 259 | + + BeanFactoryUtils.GENERATED_BEAN_NAME_SEPARATOR + ObjectUtils.getIdentityHexString(innerBd)); |
| 260 | + return resolver.apply(nameToUse, this.beanFactory.getMergedBeanDefinition( |
| 261 | + nameToUse, innerBd, this.beanDefinition)); |
| 262 | + } |
| 263 | + |
246 | 264 | /**
|
247 | 265 | * Evaluate the given value as an expression, if necessary.
|
248 | 266 | * @param value the candidate value (may be an expression)
|
@@ -362,14 +380,12 @@ private Object resolveReference(Object argName, RuntimeBeanReference ref) {
|
362 | 380 | * Resolve an inner bean definition.
|
363 | 381 | * @param argName the name of the argument that the inner bean is defined for
|
364 | 382 | * @param innerBeanName the name of the inner bean
|
365 |
| - * @param innerBd the bean definition for the inner bean |
| 383 | + * @param mbd the merged bean definition for the inner bean |
366 | 384 | * @return the resolved inner bean instance
|
367 | 385 | */
|
368 | 386 | @Nullable
|
369 |
| - private Object resolveInnerBean(Object argName, String innerBeanName, BeanDefinition innerBd) { |
370 |
| - RootBeanDefinition mbd = null; |
| 387 | + private Object resolveInnerBeanValue(Object argName, String innerBeanName, RootBeanDefinition mbd) { |
371 | 388 | try {
|
372 |
| - mbd = this.beanFactory.getMergedBeanDefinition(innerBeanName, innerBd, this.beanDefinition); |
373 | 389 | // Check given bean name whether it is unique. If not already unique,
|
374 | 390 | // add counter - increasing the counter until the name is unique.
|
375 | 391 | String actualInnerBeanName = innerBeanName;
|
@@ -400,7 +416,7 @@ private Object resolveInnerBean(Object argName, String innerBeanName, BeanDefini
|
400 | 416 | throw new BeanCreationException(
|
401 | 417 | this.beanDefinition.getResourceDescription(), this.beanName,
|
402 | 418 | "Cannot create inner bean '" + innerBeanName + "' " +
|
403 |
| - (mbd != null && mbd.getBeanClassName() != null ? "of type [" + mbd.getBeanClassName() + "] " : "") + |
| 419 | + (mbd.getBeanClassName() != null ? "of type [" + mbd.getBeanClassName() + "] " : "") + |
404 | 420 | "while setting " + argName, ex);
|
405 | 421 | }
|
406 | 422 | }
|
|
0 commit comments