/*
 * Copyright 2002-2016 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 java.lang.reflect.Constructor;

import org.springframework.beans.BeansException;
import org.springframework.lang.Nullable;

Extension of the InstantiationAwareBeanPostProcessor interface, adding a callback for predicting the eventual type of a processed bean.

NOTE: This interface is a special purpose interface, mainly for internal use within the framework. In general, application-provided post-processors should simply implement the plain BeanPostProcessor interface or derive from the InstantiationAwareBeanPostProcessorAdapter class. New methods might be added to this interface even in point releases.

Author:Juergen Hoeller
See Also:
Since:2.0.3
/** * Extension of the {@link InstantiationAwareBeanPostProcessor} interface, * adding a callback for predicting the eventual type of a processed bean. * * <p><b>NOTE:</b> This interface is a special purpose interface, mainly for * internal use within the framework. In general, application-provided * post-processors should simply implement the plain {@link BeanPostProcessor} * interface or derive from the {@link InstantiationAwareBeanPostProcessorAdapter} * class. New methods might be added to this interface even in point releases. * * @author Juergen Hoeller * @since 2.0.3 * @see InstantiationAwareBeanPostProcessorAdapter */
public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
Predict the type of the bean to be eventually returned from this processor's InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation callback.

The default implementation returns null.

Params:
  • beanClass – the raw class of the bean
  • beanName – the name of the bean
Throws:
Returns:the type of the bean, or null if not predictable
/** * Predict the type of the bean to be eventually returned from this * processor's {@link #postProcessBeforeInstantiation} callback. * <p>The default implementation returns {@code null}. * @param beanClass the raw class of the bean * @param beanName the name of the bean * @return the type of the bean, or {@code null} if not predictable * @throws org.springframework.beans.BeansException in case of errors */
@Nullable default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException { return null; }
Determine the candidate constructors to use for the given bean.

The default implementation returns null.

Params:
  • beanClass – the raw class of the bean (never null)
  • beanName – the name of the bean
Throws:
Returns:the candidate constructors, or null if none specified
/** * Determine the candidate constructors to use for the given bean. * <p>The default implementation returns {@code null}. * @param beanClass the raw class of the bean (never {@code null}) * @param beanName the name of the bean * @return the candidate constructors, or {@code null} if none specified * @throws org.springframework.beans.BeansException in case of errors */
@Nullable default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException { return null; }
Obtain a reference for early access to the specified bean, typically for the purpose of resolving a circular reference.

This callback gives post-processors a chance to expose a wrapper early - that is, before the target bean instance is fully initialized. The exposed object should be equivalent to the what BeanPostProcessor.postProcessBeforeInitialization / BeanPostProcessor.postProcessAfterInitialization would expose otherwise. Note that the object returned by this method will be used as bean reference unless the post-processor returns a different wrapper from said post-process callbacks. In other words: Those post-process callbacks may either eventually expose the same reference or alternatively return the raw bean instance from those subsequent callbacks (if the wrapper for the affected bean has been built for a call to this method already, it will be exposes as final bean reference by default).

The default implementation returns the given bean as-is.

Params:
  • bean – the raw bean instance
  • beanName – the name of the bean
Throws:
Returns:the object to expose as bean reference (typically with the passed-in bean instance as default)
/** * Obtain a reference for early access to the specified bean, * typically for the purpose of resolving a circular reference. * <p>This callback gives post-processors a chance to expose a wrapper * early - that is, before the target bean instance is fully initialized. * The exposed object should be equivalent to the what * {@link #postProcessBeforeInitialization} / {@link #postProcessAfterInitialization} * would expose otherwise. Note that the object returned by this method will * be used as bean reference unless the post-processor returns a different * wrapper from said post-process callbacks. In other words: Those post-process * callbacks may either eventually expose the same reference or alternatively * return the raw bean instance from those subsequent callbacks (if the wrapper * for the affected bean has been built for a call to this method already, * it will be exposes as final bean reference by default). * <p>The default implementation returns the given {@code bean} as-is. * @param bean the raw bean instance * @param beanName the name of the bean * @return the object to expose as bean reference * (typically with the passed-in bean instance as default) * @throws org.springframework.beans.BeansException in case of errors */
default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException { return bean; } }