Spring IOC源码解析(08)BeanFactory接口

前言

在Spring IOC机制里面,BeanFactory是其中最最核心的一个组件。之所以说它是一个组件,而不是一个类,是因为它具有相对较复杂的继承关系,同时将工厂设计模式的精髓发挥得玲离尽致。我们平时使用Spring IOC的时候,绝大多数情况是使用ApplicationContext及其子类,而非BeanFactory。而ApplicationContext的实现类,内部仍然是通过引用BeanFactory实例的方式来增强其bean管理的特性。

因此,在本文中,我们将从BeanFactory的继承关系出发,详细分析BeanFactory作为bean管理容器可能存在的功能。

继承关系图

首先,我们来看看继承关系,如下图所示。

BeanFactory继承关系

红框内的类,正是BeanFactory涉及到的继承的基础。每一个接口都定义了一部分功能,而每一个类都基于接口实现了一部分功能逻辑。而最核心的类在于DefaultListableBeanFactory,它是BeanFactory的最终实现类。

类名 作用
Beanfactory 定义了Bean的一些查询操作,包括根据名称或类型获取Bean,判断Bean是否存在等。
HierarchicalBeanFactory 定义了BeanFactory的可继承特性,包括获取BeanFactory父BeanFactory等。
ListableBeanFactory 定义了BeanDefinition的查询操作,以及根据Bean的类型获取多个Bean实现的操作等。
ConfigurableBeanFactory 意为可配置的BeanFactory,可以对BeanFactory进行更新操作,
包括各类注册器的注册,设置父BeanFactory,Bean的销毁操作等。
AutowireCapableBeanFactory 可自动装配的BeanFactory,我们可以手动注册一些Bean。
该接口尽管不是很常用,但有些场景却必须要使用到它,我们后续会具体分析使用场景。
ConfigurableListableBeanFactory ConfigurableBeanFactory之上做了一些增强,包括BeanFactory的分析,BeanDefinition的修改,以及预实例化单例Bean等操作。
AbstractBeanFactory BeanfactoryHierarchicalBeanFactoryConfigurableBeanFactory的基本实现
AbstractAutowireCapableBeanFactory AutowireCapableBeanFactory的基本实现
DefaultListableBeanFactory ListableBeanFactoryConfigurableListableBeanFactory的基本实现

BeanFactory

public interface BeanFactory {

    /**
     * 工厂Bean在BeanFactory中的bean名称前缀,用于区别于由其创建的Bean。
     * Return an instance, which may be shared or independent, of the specified bean.
     * 

This method allows a Spring BeanFactory to be used as a replacement for the * Singleton or Prototype design pattern. Callers may retain references to * returned objects in the case of Singleton beans. *

Translates aliases back to the corresponding canonical bean name. * Will ask the parent factory if the bean cannot be found in this factory instance. * @param name the name of the bean to retrieve * @return an instance of the bean * @throws NoSuchBeanDefinitionException if there is no bean with the specified name * @throws BeansException if the bean could not be obtained */ String FACTORY_BEAN_PREFIX = "&"; /** * 根据bean名称,获取bean实例。 * Return an instance, which may be shared or independent, of the specified bean. *

Behaves the same as {@link #getBean(String)}, but provides a measure of type * safety by throwing a BeanNotOfRequiredTypeException if the bean is not of the * required type. This means that ClassCastException can't be thrown on casting * the result correctly, as can happen with {@link #getBean(String)}. *

Translates aliases back to the corresponding canonical bean name. * Will ask the parent factory if the bean cannot be found in this factory instance. * @param name the name of the bean to retrieve * @param requiredType type the bean must match; can be an interface or superclass * @return an instance of the bean * @throws NoSuchBeanDefinitionException if there is no such bean definition * @throws BeanNotOfRequiredTypeException if the bean is not of the required type * @throws BeansException if the bean could not be created */ Object getBean(String name) throws BeansException; /** * 根据bean名称,获取特定类型的bean实例,当类型不匹配时抛出异常。 * Return an instance, which may be shared or independent, of the specified bean. *

Allows for specifying explicit constructor arguments / factory method arguments, * overriding the specified default arguments (if any) in the bean definition. * @param name the name of the bean to retrieve * @param args arguments to use when creating a bean instance using explicit arguments * (only applied when creating a new instance as opposed to retrieving an existing one) * @return an instance of the bean * @throws NoSuchBeanDefinitionException if there is no such bean definition * @throws BeanDefinitionStoreException if arguments have been given but * the affected bean isn't a prototype * @throws BeansException if the bean could not be created * @since 2.5 */ T getBean(String name, Class requiredType) throws BeansException; /** * 根据bean名称,获取bean实例,并且创建bean的时候需要根据args参数进行创建。 * Return an instance, which may be shared or independent, of the specified bean. *

Allows for specifying explicit constructor arguments / factory method arguments, * overriding the specified default arguments (if any) in the bean definition. * @param name the name of the bean to retrieve * @param args arguments to use when creating a bean instance using explicit arguments * (only applied when creating a new instance as opposed to retrieving an existing one) * @return an instance of the bean * @throws NoSuchBeanDefinitionException if there is no such bean definition * @throws BeanDefinitionStoreException if arguments have been given but * the affected bean isn't a prototype * @throws BeansException if the bean could not be created * @since 2.5 */ Object getBean(String name, Object... args) throws BeansException; /** * 根据bean的类型,获取bean实例。 * 当未获取到bean实例,或者获取到的bean实例数超过1个,则抛出异常。 * Return the bean instance that uniquely matches the given object type, if any. *

This method goes into {@link ListableBeanFactory} by-type lookup territory * but may also be translated into a conventional by-name lookup based on the name * of the given type. For more extensive retrieval operations across sets of beans, * use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}. * @param requiredType type the bean must match; can be an interface or superclass * @return an instance of the single bean matching the required type * @throws NoSuchBeanDefinitionException if no bean of the given type was found * @throws NoUniqueBeanDefinitionException if more than one bean of the given type was found * @throws BeansException if the bean could not be created * @since 3.0 * @see ListableBeanFactory */ T getBean(Class requiredType) throws BeansException; /** * 根据bean的类型,获取bean实例,并且创建bean的时候需要根据args参数进行创建。 * 当未获取到bean实例,或者获取到的bean实例数超过1个,则抛出异常。 * Return an instance, which may be shared or independent, of the specified bean. *

Allows for specifying explicit constructor arguments / factory method arguments, * overriding the specified default arguments (if any) in the bean definition. *

This method goes into {@link ListableBeanFactory} by-type lookup territory * but may also be translated into a conventional by-name lookup based on the name * of the given type. For more extensive retrieval operations across sets of beans, * use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}. * @param requiredType type the bean must match; can be an interface or superclass * @param args arguments to use when creating a bean instance using explicit arguments * (only applied when creating a new instance as opposed to retrieving an existing one) * @return an instance of the bean * @throws NoSuchBeanDefinitionException if there is no such bean definition * @throws BeanDefinitionStoreException if arguments have been given but * the affected bean isn't a prototype * @throws BeansException if the bean could not be created * @since 4.1 */ T getBean(Class requiredType, Object... args) throws BeansException; /** * 获取bean提供者对象,用于延迟创建。 * Return a provider for the specified bean, allowing for lazy on-demand retrieval * of instances, including availability and uniqueness options. * @param requiredType type the bean must match; can be an interface or superclass * @return a corresponding provider handle * @since 5.1 * @see #getBeanProvider(ResolvableType) */ ObjectProvider getBeanProvider(Class requiredType); /** * 根据特定类型获取bean提供者对象,用于延迟创建 * Return a provider for the specified bean, allowing for lazy on-demand retrieval * of instances, including availability and uniqueness options. * @param requiredType type the bean must match; can be a generic type declaration. * Note that collection types are not supported here, in contrast to reflective * injection points. For programmatically retrieving a list of beans matching a * specific type, specify the actual bean type as an argument here and subsequently * use {@link ObjectProvider#orderedStream()} or its lazy streaming/iteration options. * @return a corresponding provider handle * @since 5.1 * @see ObjectProvider#iterator() * @see ObjectProvider#stream() * @see ObjectProvider#orderedStream() */ ObjectProvider getBeanProvider(ResolvableType requiredType); /** * 是否包含特定名称的bean实例 * Does this bean factory contain a bean definition or externally registered singleton * instance with the given name? *

If the given name is an alias, it will be translated back to the corresponding * canonical bean name. *

If this factory is hierarchical, will ask any parent factory if the bean cannot * be found in this factory instance. *

If a bean definition or singleton instance matching the given name is found, * this method will return {@code true} whether the named bean definition is concrete * or abstract, lazy or eager, in scope or not. Therefore, note that a {@code true} * return value from this method does not necessarily indicate that {@link #getBean} * will be able to obtain an instance for the same name. * @param name the name of the bean to query * @return whether a bean with the given name is present */ boolean containsBean(String name); /** * 特定名称的bean类型是否为单例 * Is this bean a shared singleton? That is, will {@link #getBean} always * return the same instance? *

Note: This method returning {@code false} does not clearly indicate * independent instances. It indicates non-singleton instances, which may correspond * to a scoped bean as well. Use the {@link #isPrototype} operation to explicitly * check for independent instances. *

Translates aliases back to the corresponding canonical bean name. * Will ask the parent factory if the bean cannot be found in this factory instance. * @param name the name of the bean to query * @return whether this bean corresponds to a singleton instance * @throws NoSuchBeanDefinitionException if there is no bean with the given name * @see #getBean * @see #isPrototype */ boolean isSingleton(String name) throws NoSuchBeanDefinitionException; /** * 特定名称的bean类型是否为原型类型 * Is this bean a prototype? That is, will {@link #getBean} always return * independent instances? *

Note: This method returning {@code false} does not clearly indicate * a singleton object. It indicates non-independent instances, which may correspond * to a scoped bean as well. Use the {@link #isSingleton} operation to explicitly * check for a shared singleton instance. *

Translates aliases back to the corresponding canonical bean name. * Will ask the parent factory if the bean cannot be found in this factory instance. * @param name the name of the bean to query * @return whether this bean will always deliver independent instances * @throws NoSuchBeanDefinitionException if there is no bean with the given name * @since 2.0.3 * @see #getBean * @see #isSingleton */ boolean isPrototype(String name) throws NoSuchBeanDefinitionException; /** * 特定名称的bean的类型,是否和传入的类型匹配,这儿的类型指的是Spring通用类型 * Check whether the bean with the given name matches the specified type. * More specifically, check whether a {@link #getBean} call for the given name * would return an object that is assignable to the specified target type. *

Translates aliases back to the corresponding canonical bean name. * Will ask the parent factory if the bean cannot be found in this factory instance. * @param name the name of the bean to query * @param typeToMatch the type to match against (as a {@code ResolvableType}) * @return {@code true} if the bean type matches, * {@code false} if it doesn't match or cannot be determined yet * @throws NoSuchBeanDefinitionException if there is no bean with the given name * @since 4.2 * @see #getBean * @see #getType */ boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; /** * 特定名称的bean的类型,是否和传入的类型匹配,这儿的类型指的是Class * Check whether the bean with the given name matches the specified type. * More specifically, check whether a {@link #getBean} call for the given name * would return an object that is assignable to the specified target type. *

Translates aliases back to the corresponding canonical bean name. * Will ask the parent factory if the bean cannot be found in this factory instance. * @param name the name of the bean to query * @param typeToMatch the type to match against (as a {@code Class}) * @return {@code true} if the bean type matches, * {@code false} if it doesn't match or cannot be determined yet * @throws NoSuchBeanDefinitionException if there is no bean with the given name * @since 2.0.1 * @see #getBean * @see #getType */ boolean isTypeMatch(String name, Class typeToMatch) throws NoSuchBeanDefinitionException; /** * 根据bean的名称,获取bean的类型(Class) * Determine the type of the bean with the given name. More specifically, * determine the type of object that {@link #getBean} would return for the given name. *

For a {@link FactoryBean}, return the type of object that the FactoryBean creates, * as exposed by {@link FactoryBean#getObjectType()}. This may lead to the initialization * of a previously uninitialized {@code FactoryBean} (see {@link #getType(String, boolean)}). *

Translates aliases back to the corresponding canonical bean name. * Will ask the parent factory if the bean cannot be found in this factory instance. * @param name the name of the bean to query * @return the type of the bean, or {@code null} if not determinable * @throws NoSuchBeanDefinitionException if there is no bean with the given name * @since 1.1.2 * @see #getBean * @see #isTypeMatch */ @Nullable Class getType(String name) throws NoSuchBeanDefinitionException; /** * 根据bean的名称,获取bean的类型(Class),同时根据参数判断是否允许进行FactoryBean的初始化 * Determine the type of the bean with the given name. More specifically, * determine the type of object that {@link #getBean} would return for the given name. *

For a {@link FactoryBean}, return the type of object that the FactoryBean creates, * as exposed by {@link FactoryBean#getObjectType()}. Depending on the * {@code allowFactoryBeanInit} flag, this may lead to the initialization of a previously * uninitialized {@code FactoryBean} if no early type information is available. *

Translates aliases back to the corresponding canonical bean name. * Will ask the parent factory if the bean cannot be found in this factory instance. * @param name the name of the bean to query * @param allowFactoryBeanInit whether a {@code FactoryBean} may get initialized * just for the purpose of determining its object type * @return the type of the bean, or {@code null} if not determinable * @throws NoSuchBeanDefinitionException if there is no bean with the given name * @since 5.2 * @see #getBean * @see #isTypeMatch */ @Nullable Class getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException; /** * 获取指定名称bean的所有别名数组 * Return the aliases for the given bean name, if any. * All of those aliases point to the same bean when used in a {@link #getBean} call. *

If the given name is an alias, the corresponding original bean name * and other aliases (if any) will be returned, with the original bean name * being the first element in the array. *

Will ask the parent factory if the bean cannot be found in this factory instance. * @param name the bean name to check for aliases * @return the aliases, or an empty array if none * @see #getBean */ String[] getAliases(String name); }

HierarchicalBeanFactory

public interface HierarchicalBeanFactory extends BeanFactory {

    /**
     * 获取父类beanFactory
     * Return the parent bean factory, or {@code null} if there is none.
     */
    @Nullable
    BeanFactory getParentBeanFactory();

    /**
     * 判断指定名称的bean是否包含在当前的beanFactory中
     * 【注意】:如果包含在继承的beanFactory中,那么返回false
     * Return whether the local bean factory contains a bean of the given name,
     * ignoring beans defined in ancestor contexts.
     * 

This is an alternative to {@code containsBean}, ignoring a bean * of the given name from an ancestor bean factory. * @param name the name of the bean to query * @return whether a bean with the given name is defined in the local factory * @see BeanFactory#containsBean */ boolean containsLocalBean(String name); }

ConfigurableBeanFactory

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

    /**
     * 单例bean范围的标识符
     */
    String SCOPE_SINGLETON = "singleton";

    /**
     * 原型bean范围的标识符
     */
    String SCOPE_PROTOTYPE = "prototype";

    /**
     * 设置父类工厂
     */
    void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;

    /**
     * 设置bean的类加载器
     */
    void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);

    /**
     * 获取bean的类加载器
     */
    @Nullable
    ClassLoader getBeanClassLoader();

    /**
     * 设置临时的类加载器,临时的类加载器,主要在`load-time weaving`场景使用,以确保bean的加载尽可能地延迟。
     * 当所有bean加载完成之后,该类加载器将从Beanfactory自动移除。
     */
    void setTempClassLoader(@Nullable ClassLoader tempClassLoader);

    /**
     * 获取临时的类加载器
     * @since 2.5
     */
    @Nullable
    ClassLoader getTempClassLoader();

    /**
     * 设置是否缓存bean元数据,例如BeanDefination。
     */
    void setCacheBeanMetadata(boolean cacheBeanMetadata);

    /**
     * 获取是否缓存bean元数据
     */
    boolean isCacheBeanMetadata();

    /**
     * 设置bean表达式处理器,例如`#{...}`的操作。
     * Specify the resolution strategy for expressions in bean definition values.
     * 

There is no expression support active in a BeanFactory by default. * An ApplicationContext will typically set a standard expression strategy * here, supporting "#{...}" expressions in a Unified EL compatible style. * @since 3.0 */ void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver); /** * 获取bean表达式处理器 * Return the resolution strategy for expressions in bean definition values. * @since 3.0 */ @Nullable BeanExpressionResolver getBeanExpressionResolver(); /** * 设置转换服务 * @since 3.0 */ void setConversionService(@Nullable ConversionService conversionService); /** * 获取转换服务 * @since 3.0 */ @Nullable ConversionService getConversionService(); /** * 添加一个属性编辑器注册器,用于所有bean的创建过程。 * 每个bean在创建的时候都会创建一个独立的属性编辑器实例,因此它是线程安全的 * Add a PropertyEditorRegistrar to be applied to all bean creation processes. *

Such a registrar creates new PropertyEditor instances and registers them * on the given registry, fresh for each bean creation attempt. This avoids * the need for synchronization on custom editors; hence, it is generally * preferable to use this method instead of {@link #registerCustomEditor}. * @param registrar the PropertyEditorRegistrar to register */ void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); /** * 注册一个自定义属性编辑器 * 所有的bean都公用这个属性编辑器,因此它会在锁环境下使用,目的是确保线程安全。 * Register the given custom property editor for all properties of the * given type. To be invoked during factory configuration. *

Note that this method will register a shared custom editor instance; * access to that instance will be synchronized for thread-safety. It is * generally preferable to use {@link #addPropertyEditorRegistrar} instead * of this method, to avoid for the need for synchronization on custom editors. * @param requiredType type of the property * @param propertyEditorClass the {@link PropertyEditor} class to register */ void registerCustomEditor(Class requiredType, Class propertyEditorClass); /** * 拷贝属性编辑器注册器 * Initialize the given PropertyEditorRegistry with the custom editors * that have been registered with this BeanFactory. * @param registry the PropertyEditorRegistry to initialize */ void copyRegisteredEditorsTo(PropertyEditorRegistry registry); /** * 设置自定义的类型转换器 * Set a custom type converter that this BeanFactory should use for converting * bean property values, constructor argument values, etc. *

This will override the default PropertyEditor mechanism and hence make * any custom editors or custom editor registrars irrelevant. * @since 2.5 * @see #addPropertyEditorRegistrar * @see #registerCustomEditor */ void setTypeConverter(TypeConverter typeConverter); /** * 获取自定义类型转换器 * Obtain a type converter as used by this BeanFactory. This may be a fresh * instance for each call, since TypeConverters are usually not thread-safe. *

If the default PropertyEditor mechanism is active, the returned * TypeConverter will be aware of all custom editors that have been registered. * @since 2.5 */ TypeConverter getTypeConverter(); /** * 获取内嵌的值处理器 * Add a String resolver for embedded values such as annotation attributes. * @param valueResolver the String resolver to apply to embedded values * @since 3.0 */ void addEmbeddedValueResolver(StringValueResolver valueResolver); /** * 判断是否有内嵌的值处理器 * Determine whether an embedded value resolver has been registered with this * bean factory, to be applied through {@link #resolveEmbeddedValue(String)}. * @since 4.3 */ boolean hasEmbeddedValueResolver(); /** * 使用内嵌的值处理器对值进行处理。 * Resolve the given embedded value, e.g. an annotation attribute. * @param value the value to resolve * @return the resolved value (may be the original value as-is) * @since 3.0 */ @Nullable String resolveEmbeddedValue(String value); /** * 添加一个BeanPostProcessor实例 * Add a new BeanPostProcessor that will get applied to beans created * by this factory. To be invoked during factory configuration. *

Note: Post-processors submitted here will be applied in the order of * registration; any ordering semantics expressed through implementing the * {@link org.springframework.core.Ordered} interface will be ignored. Note * that autodetected post-processors (e.g. as beans in an ApplicationContext) * will always be applied after programmatically registered ones. * @param beanPostProcessor the post-processor to register */ void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); /** * 获取BeanPostProcessor实例数 * Return the current number of registered BeanPostProcessors, if any. */ int getBeanPostProcessorCount(); /** * 注册特定类型的scope,比如Request或者Session * Register the given scope, backed by the given Scope implementation. * @param scopeName the scope identifier * @param scope the backing Scope implementation */ void registerScope(String scopeName, Scope scope); /** * 获取已注册scope名称数组 * Return the names of all currently registered scopes. *

This will only return the names of explicitly registered scopes. * Built-in scopes such as "singleton" and "prototype" won't be exposed. * @return the array of scope names, or an empty array if none * @see #registerScope */ String[] getRegisteredScopeNames(); /** * 获取特定名称的scope * Return the Scope implementation for the given scope name, if any. *

This will only return explicitly registered scopes. * Built-in scopes such as "singleton" and "prototype" won't be exposed. * @param scopeName the name of the scope * @return the registered Scope implementation, or {@code null} if none * @see #registerScope */ @Nullable Scope getRegisteredScope(String scopeName); /** * 获取访问控制上下文 * Provides a security access control context relevant to this factory. * @return the applicable AccessControlContext (never {@code null}) * @since 3.0 */ AccessControlContext getAccessControlContext(); /** * 从特定的可配置BeanFactory实例中拷贝配置。注意,这儿说的是“配置” * 包括:BeanPostProcessors, Scopes, and factory-specific internal settings. * 不包括: any metadata of actual bean definitions, * * Copy all relevant configuration from the given other factory. *

Should include all standard configuration settings as well as * BeanPostProcessors, Scopes, and factory-specific internal settings. * Should not include any metadata of actual bean definitions, * such as BeanDefinition objects and bean name aliases. * @param otherFactory the other BeanFactory to copy from */ void copyConfigurationFrom(ConfigurableBeanFactory otherFactory); /** * 给bean注册别名 * Given a bean name, create an alias. We typically use this method to * support names that are illegal within XML ids (used for bean names). *

Typically invoked during factory configuration, but can also be * used for runtime registration of aliases. Therefore, a factory * implementation should synchronize alias access. * @param beanName the canonical name of the target bean * @param alias the alias to be registered for the bean * @throws BeanDefinitionStoreException if the alias is already in use */ void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; /** * 使用特定的值处理器,处理所有别名 * Resolve all alias target names and aliases registered in this * factory, applying the given StringValueResolver to them. *

The value resolver may for example resolve placeholders * in target bean names and even in alias names. * @param valueResolver the StringValueResolver to apply * @since 2.5 */ void resolveAliases(StringValueResolver valueResolver); /** * 获取一个合并的BeanDefinition,子类的话,可以将父类的属性也合并过来 * Return a merged BeanDefinition for the given bean name, * merging a child bean definition with its parent if necessary. * Considers bean definitions in ancestor factories as well. * @param beanName the name of the bean to retrieve the merged definition for * @return a (potentially merged) BeanDefinition for the given bean * @throws NoSuchBeanDefinitionException if there is no bean definition with the given name * @since 2.5 */ BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; /** * 是否工厂bean * Determine whether the bean with the given name is a FactoryBean. * @param name the name of the bean to check * @return whether the bean is a FactoryBean * ({@code false} means the bean exists but is not a FactoryBean) * @throws NoSuchBeanDefinitionException if there is no bean with the given name * @since 2.5 */ boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; /** * 设置特定名称的bean是否在创建过程中 * Explicitly control the current in-creation status of the specified bean. * For container-internal use only. * @param beanName the name of the bean * @param inCreation whether the bean is currently in creation * @since 3.1 */ void setCurrentlyInCreation(String beanName, boolean inCreation); /** * 判断特定名称的bean是否在创建过程中 * Determine whether the specified bean is currently in creation. * @param beanName the name of the bean * @return whether the bean is currently in creation * @since 2.5 */ boolean isCurrentlyInCreation(String beanName); /** * 注册bean之间的依赖关系 * Register a dependent bean for the given bean, * to be destroyed before the given bean is destroyed. * @param beanName the name of the bean * @param dependentBeanName the name of the dependent bean * @since 2.5 */ void registerDependentBean(String beanName, String dependentBeanName); /** * 获取所有依赖特定名称bean的bean名称 * Return the names of all beans which depend on the specified bean, if any. * @param beanName the name of the bean * @return the array of dependent bean names, or an empty array if none * @since 2.5 */ String[] getDependentBeans(String beanName); /** * 获取特定名称bean的所有依赖bean * Return the names of all beans that the specified bean depends on, if any. * @param beanName the name of the bean * @return the array of names of beans which the bean depends on, * or an empty array if none * @since 2.5 */ String[] getDependenciesForBean(String beanName); /** * 销毁bean * Destroy the given bean instance (usually a prototype instance * obtained from this factory) according to its bean definition. *

Any exception that arises during destruction should be caught * and logged instead of propagated to the caller of this method. * @param beanName the name of the bean definition * @param beanInstance the bean instance to destroy */ void destroyBean(String beanName, Object beanInstance); /** * 在特定scope下,销毁指定名称的bean对象 * Destroy the specified scoped bean in the current target scope, if any. *

Any exception that arises during destruction should be caught * and logged instead of propagated to the caller of this method. * @param beanName the name of the scoped bean */ void destroyScopedBean(String beanName); /** * 销毁单例 * Destroy all singleton beans in this factory, including inner beans that have * been registered as disposable. To be called on shutdown of a factory. *

Any exception that arises during destruction should be caught * and logged instead of propagated to the caller of this method. */ void destroySingletons(); }

AutowireCapableBeanFactory

public interface AutowireCapableBeanFactory extends BeanFactory {

    /**
     * 没有外部依赖的注入方式
     * Constant that indicates no externally defined autowiring. Note that
     * BeanFactoryAware etc and annotation-driven injection will still be applied.
     * @see #createBean
     * @see #autowire
     * @see #autowireBeanProperties
     */
    int AUTOWIRE_NO = 0;

    /**
     * 按照名称注入
     * Constant that indicates autowiring bean properties by name
     * (applying to all bean property setters).
     * @see #createBean
     * @see #autowire
     * @see #autowireBeanProperties
     */
    int AUTOWIRE_BY_NAME = 1;

    /**
     * 按照类型注入
     * Constant that indicates autowiring bean properties by type
     * (applying to all bean property setters).
     * @see #createBean
     * @see #autowire
     * @see #autowireBeanProperties
     */
    int AUTOWIRE_BY_TYPE = 2;

    /**
     * 以构造器的方式注入
     * Constant that indicates autowiring the greediest constructor that
     * can be satisfied (involves resolving the appropriate constructor).
     * @see #createBean
     * @see #autowire
     */
    int AUTOWIRE_CONSTRUCTOR = 3;

    /**
     * 自动检测的方式注入,目前已废弃。
     * Constant that indicates determining an appropriate autowire strategy
     * through introspection of the bean class.
     * @see #createBean
     * @see #autowire
     * @deprecated as of Spring 3.0: If you are using mixed autowiring strategies,
     * prefer annotation-based autowiring for clearer demarcation of autowiring needs.
     */
    @Deprecated
    int AUTOWIRE_AUTODETECT = 4;

    /**
     * Suffix for the "original instance" convention when initializing an existing
     * bean instance: to be appended to the fully-qualified bean class name,
     * e.g. "com.mypackage.MyClass.ORIGINAL", in order to enforce the given instance
     * to be returned, i.e. no proxies etc.
     * @since 5.1
     * @see #initializeBean(Object, String)
     * @see #applyBeanPostProcessorsBeforeInitialization(Object, String)
     * @see #applyBeanPostProcessorsAfterInitialization(Object, String)
     */
    String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";


    //-------------------------------------------------------------------------
    // Typical methods for creating and populating external bean instances
    //-------------------------------------------------------------------------

    /**
     * 创建特定类型的bean实例,将会执行完整的bean初始化,包括BeanPostProcessors操作。
     * Fully create a new bean instance of the given class.
     * 

Performs full initialization of the bean, including all applicable * {@link BeanPostProcessor BeanPostProcessors}. *

Note: This is intended for creating a fresh instance, populating annotated * fields and methods as well as applying all standard bean initialization callbacks. * It does not imply traditional by-name or by-type autowiring of properties; * use {@link #createBean(Class, int, boolean)} for those purposes. * @param beanClass the class of the bean to create * @return the new bean instance * @throws BeansException if instantiation or wiring failed */ T createBean(Class beanClass) throws BeansException; /** * 注入bean * Populate the given bean instance through applying after-instantiation callbacks * and bean property post-processing (e.g. for annotation-driven injection). *

Note: This is essentially intended for (re-)populating annotated fields and * methods, either for new instances or for deserialized instances. It does * not imply traditional by-name or by-type autowiring of properties; * use {@link #autowireBeanProperties} for those purposes. * @param existingBean the existing bean instance * @throws BeansException if wiring failed */ void autowireBean(Object existingBean) throws BeansException; /** * 配置bean,包括注入属性,解决bean属性值,应用bean工厂回调,应用beanPostProcessor * Configure the given raw bean: autowiring bean properties, applying * bean property values, applying factory callbacks such as {@code setBeanName} * and {@code setBeanFactory}, and also applying all bean post processors * (including ones which might wrap the given raw bean). *

This is effectively a superset of what {@link #initializeBean} provides, * fully applying the configuration specified by the corresponding bean definition. * Note: This method requires a bean definition for the given name! * @param existingBean the existing bean instance * @param beanName the name of the bean, to be passed to it if necessary * (a bean definition of that name has to be available) * @return the bean instance to use, either the original or a wrapped one * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException * if there is no bean definition with the given name * @throws BeansException if the initialization failed * @see #initializeBean */ Object configureBean(Object existingBean, String beanName) throws BeansException; //------------------------------------------------------------------------- // Specialized methods for fine-grained control over the bean lifecycle //------------------------------------------------------------------------- /** * 创建bean * Fully create a new bean instance of the given class with the specified * autowire strategy. All constants defined in this interface are supported here. *

Performs full initialization of the bean, including all applicable * {@link BeanPostProcessor BeanPostProcessors}. This is effectively a superset * of what {@link #autowire} provides, adding {@link #initializeBean} behavior. * @param beanClass the class of the bean to create * @param autowireMode by name or type, using the constants in this interface * @param dependencyCheck whether to perform a dependency check for objects * (not applicable to autowiring a constructor, thus ignored there) * @return the new bean instance * @throws BeansException if instantiation or wiring failed * @see #AUTOWIRE_NO * @see #AUTOWIRE_BY_NAME * @see #AUTOWIRE_BY_TYPE * @see #AUTOWIRE_CONSTRUCTOR */ Object createBean(Class beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; /** * 使用特定的注入策略,实例化并注入一个bean * Instantiate a new bean instance of the given class with the specified autowire * strategy. All constants defined in this interface are supported here. * Can also be invoked with {@code AUTOWIRE_NO} in order to just apply * before-instantiation callbacks (e.g. for annotation-driven injection). *

Does not apply standard {@link BeanPostProcessor BeanPostProcessors} * callbacks or perform any further initialization of the bean. This interface * offers distinct, fine-grained operations for those purposes, for example * {@link #initializeBean}. However, {@link InstantiationAwareBeanPostProcessor} * callbacks are applied, if applicable to the construction of the instance. * @param beanClass the class of the bean to instantiate * @param autowireMode by name or type, using the constants in this interface * @param dependencyCheck whether to perform a dependency check for object * references in the bean instance (not applicable to autowiring a constructor, * thus ignored there) * @return the new bean instance * @throws BeansException if instantiation or wiring failed * @see #AUTOWIRE_NO * @see #AUTOWIRE_BY_NAME * @see #AUTOWIRE_BY_TYPE * @see #AUTOWIRE_CONSTRUCTOR * @see #AUTOWIRE_AUTODETECT * @see #initializeBean * @see #applyBeanPostProcessorsBeforeInitialization * @see #applyBeanPostProcessorsAfterInitialization */ Object autowire(Class beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; /** * 使用特定的注入策略,注入指定bean的所有属性 * Autowire the bean properties of the given bean instance by name or type. * Can also be invoked with {@code AUTOWIRE_NO} in order to just apply * after-instantiation callbacks (e.g. for annotation-driven injection). *

Does not apply standard {@link BeanPostProcessor BeanPostProcessors} * callbacks or perform any further initialization of the bean. This interface * offers distinct, fine-grained operations for those purposes, for example * {@link #initializeBean}. However, {@link InstantiationAwareBeanPostProcessor} * callbacks are applied, if applicable to the configuration of the instance. * @param existingBean the existing bean instance * @param autowireMode by name or type, using the constants in this interface * @param dependencyCheck whether to perform a dependency check for object * references in the bean instance * @throws BeansException if wiring failed * @see #AUTOWIRE_BY_NAME * @see #AUTOWIRE_BY_TYPE * @see #AUTOWIRE_NO */ void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException; /** * 解决bean属性的值,该方法不会注入bean的属性,而只是应用已经存在的属性。 * 我们可以使用`autowireBeanProperties`来注入属性 * Apply the property values of the bean definition with the given name to * the given bean instance. The bean definition can either define a fully * self-contained bean, reusing its property values, or just property values * meant to be used for existing bean instances. *

This method does not autowire bean properties; it just applies * explicitly defined property values. Use the {@link #autowireBeanProperties} * method to autowire an existing bean instance. * Note: This method requires a bean definition for the given name! *

Does not apply standard {@link BeanPostProcessor BeanPostProcessors} * callbacks or perform any further initialization of the bean. This interface * offers distinct, fine-grained operations for those purposes, for example * {@link #initializeBean}. However, {@link InstantiationAwareBeanPostProcessor} * callbacks are applied, if applicable to the configuration of the instance. * @param existingBean the existing bean instance * @param beanName the name of the bean definition in the bean factory * (a bean definition of that name has to be available) * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException * if there is no bean definition with the given name * @throws BeansException if applying the property values failed * @see #autowireBeanProperties */ void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException; /** * 初始化bean * Initialize the given raw bean, applying factory callbacks * such as {@code setBeanName} and {@code setBeanFactory}, * also applying all bean post processors (including ones which * might wrap the given raw bean). *

Note that no bean definition of the given name has to exist * in the bean factory. The passed-in bean name will simply be used * for callbacks but not checked against the registered bean definitions. * @param existingBean the existing bean instance * @param beanName the name of the bean, to be passed to it if necessary * (only passed to {@link BeanPostProcessor BeanPostProcessors}; * can follow the {@link #ORIGINAL_INSTANCE_SUFFIX} convention in order to * enforce the given instance to be returned, i.e. no proxies etc) * @return the bean instance to use, either the original or a wrapped one * @throws BeansException if the initialization failed * @see #ORIGINAL_INSTANCE_SUFFIX */ Object initializeBean(Object existingBean, String beanName) throws BeansException; /** * 应用`BeanPostProcessor`进行bean实例化后,初始化前的处理 * Apply {@link BeanPostProcessor BeanPostProcessors} to the given existing bean * instance, invoking their {@code postProcessBeforeInitialization} methods. * The returned bean instance may be a wrapper around the original. * @param existingBean the existing bean instance * @param beanName the name of the bean, to be passed to it if necessary * (only passed to {@link BeanPostProcessor BeanPostProcessors}; * can follow the {@link #ORIGINAL_INSTANCE_SUFFIX} convention in order to * enforce the given instance to be returned, i.e. no proxies etc) * @return the bean instance to use, either the original or a wrapped one * @throws BeansException if any post-processing failed * @see BeanPostProcessor#postProcessBeforeInitialization * @see #ORIGINAL_INSTANCE_SUFFIX */ Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException; /** * 应用`BeanPostProcessor`进行bean初始化后的处理 * Apply {@link BeanPostProcessor BeanPostProcessors} to the given existing bean * instance, invoking their {@code postProcessAfterInitialization} methods. * The returned bean instance may be a wrapper around the original. * @param existingBean the existing bean instance * @param beanName the name of the bean, to be passed to it if necessary * (only passed to {@link BeanPostProcessor BeanPostProcessors}; * can follow the {@link #ORIGINAL_INSTANCE_SUFFIX} convention in order to * enforce the given instance to be returned, i.e. no proxies etc) * @return the bean instance to use, either the original or a wrapped one * @throws BeansException if any post-processing failed * @see BeanPostProcessor#postProcessAfterInitialization * @see #ORIGINAL_INSTANCE_SUFFIX */ Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException; /** * 销毁一个已存在的bean * Destroy the given bean instance (typically coming from {@link #createBean}), * applying the {@link org.springframework.beans.factory.DisposableBean} contract as well as * registered {@link DestructionAwareBeanPostProcessor DestructionAwareBeanPostProcessors}. *

Any exception that arises during destruction should be caught * and logged instead of propagated to the caller of this method. * @param existingBean the bean instance to destroy */ void destroyBean(Object existingBean); //------------------------------------------------------------------------- // Delegate methods for resolving injection points //------------------------------------------------------------------------- /** * 根据类型,获取bean名称持有者对象,bean不存在或超过一个,都将抛出异常。 * Resolve the bean instance that uniquely matches the given object type, if any, * including its bean name. *

This is effectively a variant of {@link #getBean(Class)} which preserves the * bean name of the matching instance. * @param requiredType type the bean must match; can be an interface or superclass * @return the bean name plus bean instance * @throws NoSuchBeanDefinitionException if no matching bean was found * @throws NoUniqueBeanDefinitionException if more than one matching bean was found * @throws BeansException if the bean could not be created * @since 4.3.3 * @see #getBean(Class) */ NamedBeanHolder resolveNamedBean(Class requiredType) throws BeansException; /** * 根据名称,获取bean名称持有者对象,bean不存在,将抛出异常。 * Resolve a bean instance for the given bean name, providing a dependency descriptor * for exposure to target factory methods. *

This is effectively a variant of {@link #getBean(String, Class)} which supports * factory methods with an {@link org.springframework.beans.factory.InjectionPoint} * argument. * @param name the name of the bean to look up * @param descriptor the dependency descriptor for the requesting injection point * @return the corresponding bean instance * @throws NoSuchBeanDefinitionException if there is no bean with the specified name * @throws BeansException if the bean could not be created * @since 5.1.5 * @see #getBean(String, Class) */ Object resolveBeanByName(String name, DependencyDescriptor descriptor) throws BeansException; /** * Resolve the specified dependency against the beans defined in this factory. * @param descriptor the descriptor for the dependency (field/method/constructor) * @param requestingBeanName the name of the bean which declares the given dependency * @return the resolved object, or {@code null} if none found * @throws NoSuchBeanDefinitionException if no matching bean was found * @throws NoUniqueBeanDefinitionException if more than one matching bean was found * @throws BeansException if dependency resolution failed for any other reason * @since 2.5 * @see #resolveDependency(DependencyDescriptor, String, Set, TypeConverter) */ @Nullable Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException; /** * Resolve the specified dependency against the beans defined in this factory. * @param descriptor the descriptor for the dependency (field/method/constructor) * @param requestingBeanName the name of the bean which declares the given dependency * @param autowiredBeanNames a Set that all names of autowired beans (used for * resolving the given dependency) are supposed to be added to * @param typeConverter the TypeConverter to use for populating arrays and collections * @return the resolved object, or {@code null} if none found * @throws NoSuchBeanDefinitionException if no matching bean was found * @throws NoUniqueBeanDefinitionException if more than one matching bean was found * @throws BeansException if dependency resolution failed for any other reason * @since 2.5 * @see DependencyDescriptor */ @Nullable Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName, @Nullable Set autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException; }

这个工厂的应用场景,可参考文章:https://www.jianshu.com/p/d564335fafab

ListableBeanFactory

public interface ListableBeanFactory extends BeanFactory {

    /**
     * 是否包含bean的定义
     */
    boolean containsBeanDefinition(String beanName);

    /**
     * 获取bean的定义数
     */
    int getBeanDefinitionCount();

    /**
     * 获取bean定义名称数组
     */
    String[] getBeanDefinitionNames();

    /**
     * 获取特定类型的bean名称数组
     */
    String[] getBeanNamesForType(ResolvableType type);

    /**
     * 获取特定类型的bean名称数组,同时去掉非单例类型,且允许提前初始化
     */
    String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit);

    /**
     * 获取特定类型的bean名称数组
     */
    String[] getBeanNamesForType(@Nullable Class type);

    /**
     * 获取特定类型的bean名称数组,同时去掉非单例类型,且允许提前初始化
     */
    String[] getBeanNamesForType(@Nullable Class type, boolean includeNonSingletons, boolean allowEagerInit);

    /**
     * 获取特定类型的bean map,key为bean的名称,value为bean对象
     */
     Map getBeansOfType(@Nullable Class type) throws BeansException;

    /**
     * 获取特定类型的bean map,key为bean的名称,value为bean对象
     * 同时去掉非单例类型,且允许提前初始化
     */
     Map getBeansOfType(@Nullable Class type, boolean includeNonSingletons, boolean allowEagerInit)
            throws BeansException;

    /**
     * 获取有特定注解修饰的bean名称数组
     */
    String[] getBeanNamesForAnnotation(Class annotationType);

    /**
     * 获取有特定注解修饰的bean map,key为bean的名称,value为bean对象
     */
    Map getBeansWithAnnotation(Class annotationType) throws BeansException;

    /**
     * 获取特定名称的bean的特定类型注解
     */
    @Nullable
     A findAnnotationOnBean(String beanName, Class annotationType)
            throws NoSuchBeanDefinitionException;
}

ConfigurableListableBeanFactory

public interface ConfigurableListableBeanFactory
        extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {

    /**
     * 在注入的时候,忽略特定类型的依赖
     */
    void ignoreDependencyType(Class type);

    /**
     * 忽略特定接口的依赖注入,
     * 比如BeanFactory会忽略BeanFactoryAware的注入
     * 再比如ApplicationContext会忽略ApplicationContextAware的注入
     * Ignore the given dependency interface for autowiring.
     * 

This will typically be used by application contexts to register * dependencies that are resolved in other ways, like BeanFactory through * BeanFactoryAware or ApplicationContext through ApplicationContextAware. *

By default, only the BeanFactoryAware interface is ignored. * For further types to ignore, invoke this method for each type. * @param ifc the dependency interface to ignore * @see org.springframework.beans.factory.BeanFactoryAware * @see org.springframework.context.ApplicationContextAware */ void ignoreDependencyInterface(Class ifc); /** * 针对特定类型,注入特定的值, * 比如一个单例bean依赖ApplicationContext,而ApplicationContext并非一个bean对象 * Register a special dependency type with corresponding autowired value. *

This is intended for factory/context references that are supposed * to be autowirable but are not defined as beans in the factory: * e.g. a dependency of type ApplicationContext resolved to the * ApplicationContext instance that the bean is living in. *

Note: There are no such default types registered in a plain BeanFactory, * not even for the BeanFactory interface itself. * @param dependencyType the dependency type to register. This will typically * be a base interface such as BeanFactory, with extensions of it resolved * as well if declared as an autowiring dependency (e.g. ListableBeanFactory), * as long as the given value actually implements the extended interface. * @param autowiredValue the corresponding autowired value. This may also be an * implementation of the {@link org.springframework.beans.factory.ObjectFactory} * interface, which allows for lazy resolution of the actual target value. */ void registerResolvableDependency(Class dependencyType, @Nullable Object autowiredValue); /** * bean是否作为一个注入的候选者 * Determine whether the specified bean qualifies as an autowire candidate, * to be injected into other beans which declare a dependency of matching type. *

This method checks ancestor factories as well. * @param beanName the name of the bean to check * @param descriptor the descriptor of the dependency to resolve * @return whether the bean should be considered as autowire candidate * @throws NoSuchBeanDefinitionException if there is no bean with the given name */ boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException; /** * 获取bean定义 * Return the registered BeanDefinition for the specified bean, allowing access * to its property values and constructor argument value (which can be * modified during bean factory post-processing). *

A returned BeanDefinition object should not be a copy but the original * definition object as registered in the factory. This means that it should * be castable to a more specific implementation type, if necessary. *

NOTE: This method does not consider ancestor factories. * It is only meant for accessing local bean definitions of this factory. * @param beanName the name of the bean * @return the registered BeanDefinition * @throws NoSuchBeanDefinitionException if there is no bean with the given name * defined in this factory */ BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; /** * 获取bean名称迭代器 * Return a unified view over all bean names managed by this factory. *

Includes bean definition names as well as names of manually registered * singleton instances, with bean definition names consistently coming first, * analogous to how type/annotation specific retrieval of bean names works. * @return the composite iterator for the bean names view * @since 4.1.2 * @see #containsBeanDefinition * @see #registerSingleton * @see #getBeanNamesForType * @see #getBeanNamesForAnnotation */ Iterator getBeanNamesIterator(); /** * 清除元数据缓存 * Clear the merged bean definition cache, removing entries for beans * which are not considered eligible for full metadata caching yet. *

Typically triggered after changes to the original bean definitions, * e.g. after applying a {@link BeanFactoryPostProcessor}. Note that metadata * for beans which have already been created at this point will be kept around. * @since 4.2 * @see #getBeanDefinition * @see #getMergedBeanDefinition */ void clearMetadataCache(); /** * 冻结bean配置,从而导致bean定义不能被修改,也不能进一步操作 * Freeze all bean definitions, signalling that the registered bean definitions * will not be modified or post-processed any further. *

This allows the factory to aggressively cache bean definition metadata. */ void freezeConfiguration(); /** * bean配置是否被冻结 * Return whether this factory's bean definitions are frozen, * i.e. are not supposed to be modified or post-processed any further. * @return {@code true} if the factory's configuration is considered frozen */ boolean isConfigurationFrozen(); /** * 预初始化单例bean对象 * Ensure that all non-lazy-init singletons are instantiated, also considering * {@link org.springframework.beans.factory.FactoryBean FactoryBeans}. * Typically invoked at the end of factory setup, if desired. * @throws BeansException if one of the singleton beans could not be created. * Note: This may have left the factory with some beans already initialized! * Call {@link #destroySingletons()} for full cleanup in this case. * @see #destroySingletons() */ void preInstantiateSingletons() throws BeansException; }

总结

本文分析了Spring自带的、我们经常使用到的BeanFactory相关接口,功能繁多,但结构清晰。

我们对此进行了详细分析,已经基本知道其包含的内容,以及要实现的功能了。

你可能感兴趣的:(Spring IOC源码解析(08)BeanFactory接口)