/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory.config;

import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

Holder for a BeanDefinition with name and aliases. Can be registered as a placeholder for an inner bean.

Can also be used for programmatic registration of inner bean definitions. If you don't care about BeanNameAware and the like, registering RootBeanDefinition or ChildBeanDefinition is good enough.

Author:Juergen Hoeller
See Also:
Since:1.0.2
/** * Holder for a BeanDefinition with name and aliases. * Can be registered as a placeholder for an inner bean. * * <p>Can also be used for programmatic registration of inner bean * definitions. If you don't care about BeanNameAware and the like, * registering RootBeanDefinition or ChildBeanDefinition is good enough. * * @author Juergen Hoeller * @since 1.0.2 * @see org.springframework.beans.factory.BeanNameAware * @see org.springframework.beans.factory.support.RootBeanDefinition * @see org.springframework.beans.factory.support.ChildBeanDefinition */
public class BeanDefinitionHolder implements BeanMetadataElement { private final BeanDefinition beanDefinition; private final String beanName; @Nullable private final String[] aliases;
Create a new BeanDefinitionHolder.
Params:
  • beanDefinition – the BeanDefinition to wrap
  • beanName – the name of the bean, as specified for the bean definition
/** * Create a new BeanDefinitionHolder. * @param beanDefinition the BeanDefinition to wrap * @param beanName the name of the bean, as specified for the bean definition */
public BeanDefinitionHolder(BeanDefinition beanDefinition, String beanName) { this(beanDefinition, beanName, null); }
Create a new BeanDefinitionHolder.
Params:
  • beanDefinition – the BeanDefinition to wrap
  • beanName – the name of the bean, as specified for the bean definition
  • aliases – alias names for the bean, or null if none
/** * Create a new BeanDefinitionHolder. * @param beanDefinition the BeanDefinition to wrap * @param beanName the name of the bean, as specified for the bean definition * @param aliases alias names for the bean, or {@code null} if none */
public BeanDefinitionHolder(BeanDefinition beanDefinition, String beanName, @Nullable String[] aliases) { Assert.notNull(beanDefinition, "BeanDefinition must not be null"); Assert.notNull(beanName, "Bean name must not be null"); this.beanDefinition = beanDefinition; this.beanName = beanName; this.aliases = aliases; }
Copy constructor: Create a new BeanDefinitionHolder with the same contents as the given BeanDefinitionHolder instance.

Note: The wrapped BeanDefinition reference is taken as-is; it is not deeply copied.

Params:
  • beanDefinitionHolder – the BeanDefinitionHolder to copy
/** * Copy constructor: Create a new BeanDefinitionHolder with the * same contents as the given BeanDefinitionHolder instance. * <p>Note: The wrapped BeanDefinition reference is taken as-is; * it is {@code not} deeply copied. * @param beanDefinitionHolder the BeanDefinitionHolder to copy */
public BeanDefinitionHolder(BeanDefinitionHolder beanDefinitionHolder) { Assert.notNull(beanDefinitionHolder, "BeanDefinitionHolder must not be null"); this.beanDefinition = beanDefinitionHolder.getBeanDefinition(); this.beanName = beanDefinitionHolder.getBeanName(); this.aliases = beanDefinitionHolder.getAliases(); }
Return the wrapped BeanDefinition.
/** * Return the wrapped BeanDefinition. */
public BeanDefinition getBeanDefinition() { return this.beanDefinition; }
Return the primary name of the bean, as specified for the bean definition.
/** * Return the primary name of the bean, as specified for the bean definition. */
public String getBeanName() { return this.beanName; }
Return the alias names for the bean, as specified directly for the bean definition.
Returns:the array of alias names, or null if none
/** * Return the alias names for the bean, as specified directly for the bean definition. * @return the array of alias names, or {@code null} if none */
@Nullable public String[] getAliases() { return this.aliases; }
Expose the bean definition's source object.
See Also:
  • getSource.getSource()
/** * Expose the bean definition's source object. * @see BeanDefinition#getSource() */
@Override @Nullable public Object getSource() { return this.beanDefinition.getSource(); }
Determine whether the given candidate name matches the bean name or the aliases stored in this bean definition.
/** * Determine whether the given candidate name matches the bean name * or the aliases stored in this bean definition. */
public boolean matchesName(@Nullable String candidateName) { return (candidateName != null && (candidateName.equals(this.beanName) || candidateName.equals(BeanFactoryUtils.transformedBeanName(this.beanName)) || ObjectUtils.containsElement(this.aliases, candidateName))); }
Return a friendly, short description for the bean, stating name and aliases.
See Also:
/** * Return a friendly, short description for the bean, stating name and aliases. * @see #getBeanName() * @see #getAliases() */
public String getShortDescription() { if (this.aliases == null) { return "Bean definition with name '" + this.beanName + "'"; } return "Bean definition with name '" + this.beanName + "' and aliases [" + StringUtils.arrayToCommaDelimitedString(this.aliases) + ']'; }
Return a long description for the bean, including name and aliases as well as a description of the contained BeanDefinition.
See Also:
/** * Return a long description for the bean, including name and aliases * as well as a description of the contained {@link BeanDefinition}. * @see #getShortDescription() * @see #getBeanDefinition() */
public String getLongDescription() { return getShortDescription() + ": " + this.beanDefinition; }
This implementation returns the long description. Can be overridden to return the short description or any kind of custom description instead.
See Also:
/** * This implementation returns the long description. Can be overridden * to return the short description or any kind of custom description instead. * @see #getLongDescription() * @see #getShortDescription() */
@Override public String toString() { return getLongDescription(); } @Override public boolean equals(@Nullable Object other) { if (this == other) { return true; } if (!(other instanceof BeanDefinitionHolder)) { return false; } BeanDefinitionHolder otherHolder = (BeanDefinitionHolder) other; return this.beanDefinition.equals(otherHolder.beanDefinition) && this.beanName.equals(otherHolder.beanName) && ObjectUtils.nullSafeEquals(this.aliases, otherHolder.aliases); } @Override public int hashCode() { int hashCode = this.beanDefinition.hashCode(); hashCode = 29 * hashCode + this.beanName.hashCode(); hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.aliases); return hashCode; } }