All Downloads are FREE. Search and download functionalities are using the official Maven repository.

infra.beans.factory.config.SmartInstantiationAwareBeanPostProcessor Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2017 - 2024 the original author or authors.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see [https://www.gnu.org/licenses/]
 */

package infra.beans.factory.config;

import java.lang.reflect.Constructor;

import infra.beans.BeansException;
import infra.beans.factory.InitializationBeanPostProcessor;
import infra.lang.Nullable;

/**
 * Extension of the {@link 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 {@link BeanPostProcessor} * interface or derive from the {@link InstantiationAwareBeanPostProcessor} * class. New methods might be added to this interface even in point releases. * * @author Juergen Hoeller * @author Harry Yang * @since 4.0 2021/12/20 17:02 */ public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor { /** * Predict the type of the bean to be eventually returned from this * processor's {@link #postProcessBeforeInstantiation} callback. *

The default implementation returns {@code null}. * Specific implementations should try to predict the bean type as * far as known/cached already, without extra processing steps. * * @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 BeansException in case of errors */ @Nullable default Class predictBeanType(Class beanClass, String beanName) throws BeansException { return null; } /** * Determine the type of the bean to be eventually returned from this * processor's {@link #postProcessBeforeInstantiation} callback. *

The default implementation returns the given bean class as-is. * Specific implementations should fully evaluate their processing steps * in order to create/initialize a potential proxy class upfront. * * @param beanClass the raw class of the bean * @param beanName the name of the bean * @return the type of the bean (never {@code null}) * @throws BeansException in case of errors */ default Class determineBeanType(Class beanClass, String beanName) throws BeansException { return beanClass; } /** * Determine the candidate constructors to use for the given bean. *

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 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 * {@link InitializationBeanPostProcessor#postProcessBeforeInitialization} * / {@link InitializationBeanPostProcessor#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 {@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 BeansException in case of errors */ default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException { return bean; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy