zoukankan      html  css  js  c++  java
  • Spring BeanFactory源码学习

    一.BeanFactory

      BeanFactory是Spring IOC容器的基础,是IOC容器的基础接口,所有的容器都是从它这里继承实现而来。BeanFactory提供了最基本的IOC容器的功能,即所有的容器至少需要实现的标准。BeanFactory体系结构是典型的工厂方法模式,即什么样的工厂生产什么样的产品。BeanFactory是最基本的抽象工厂,而其他的IOC容器只不过是具体的工厂,对应着各自的Bean定义方法。但同时,其他容器也针对具体场景不同,进行了扩充,提供具体的服务。

    二.BeanFacory源码

    1.java doc

      首先是Java doc,现在阅读源码的习惯是一定要理解了java doc的描述,因为这里是作者的描述,没有人比作者更明白这个类,这个接口要干什么。

    /**
     * The root interface for accessing a Spring bean container.
     * This is the basic client view of a bean container;
     * further interfaces such as {@link ListableBeanFactory} and
     * {@link org.springframework.beans.factory.config.ConfigurableBeanFactory}
     * are available for specific purposes.
     *
     * <p>This interface is implemented by objects that hold a number of bean definitions,
     * each uniquely identified by a String name. Depending on the bean definition,
     * the factory will return either an independent instance of a contained object
     * (the Prototype design pattern), or a single shared instance (a superior
     * alternative to the Singleton design pattern, in which the instance is a
     * singleton in the scope of the factory). Which type of instance will be returned
     * depends on the bean factory configuration: the API is the same. Since Spring
     * 2.0, further scopes are available depending on the concrete application
     * context (e.g. "request" and "session" scopes in a web environment).
     *
     * <p>The point of this approach is that the BeanFactory is a central registry
     * of application components, and centralizes configuration of application
     * components (no more do individual objects need to read properties files,
     * for example). See chapters 4 and 11 of "Expert One-on-One J2EE Design and
     * Development" for a discussion of the benefits of this approach.
     *
     * <p>Note that it is generally better to rely on Dependency Injection
     * ("push" configuration) to configure application objects through setters
     * or constructors, rather than use any form of "pull" configuration like a
     * BeanFactory lookup. Spring's Dependency Injection functionality is
     * implemented using this BeanFactory interface and its subinterfaces.
     *
     * <p>Normally a BeanFactory will load bean definitions stored in a configuration
     * source (such as an XML document), and use the {@code org.springframework.beans}
     * package to configure the beans. However, an implementation could simply return
     * Java objects it creates as necessary directly in Java code. There are no
     * constraints on how the definitions could be stored: LDAP, RDBMS, XML,
     * properties file, etc. Implementations are encouraged to support references
     * amongst beans (Dependency Injection).
     *
     * <p>In contrast to the methods in {@link ListableBeanFactory}, all of the
     * operations in this interface will also check parent factories if this is a
     * {@link HierarchicalBeanFactory}. If a bean is not found in this factory instance,
     * the immediate parent factory will be asked. Beans in this factory instance
     * are supposed to override beans of the same name in any parent factory.
     *
     * <p>Bean factory implementations should support the standard bean lifecycle interfaces
     * as far as possible. The full set of initialization methods and their standard order is:<br>
     * 1. BeanNameAware's {@code setBeanName}<br>
     * 2. BeanClassLoaderAware's {@code setBeanClassLoader}<br>
     * 3. BeanFactoryAware's {@code setBeanFactory}<br>
     * 4. ResourceLoaderAware's {@code setResourceLoader}
     * (only applicable when running in an application context)<br>
     * 5. ApplicationEventPublisherAware's {@code setApplicationEventPublisher}
     * (only applicable when running in an application context)<br>
     * 6. MessageSourceAware's {@code setMessageSource}
     * (only applicable when running in an application context)<br>
     * 7. ApplicationContextAware's {@code setApplicationContext}
     * (only applicable when running in an application context)<br>
     * 8. ServletContextAware's {@code setServletContext}
     * (only applicable when running in a web application context)<br>
     * 9. {@code postProcessBeforeInitialization} methods of BeanPostProcessors<br>
     * 10. InitializingBean's {@code afterPropertiesSet}<br>
     * 11. a custom init-method definition<br>
     * 12. {@code postProcessAfterInitialization} methods of BeanPostProcessors
     *
     * <p>On shutdown of a bean factory, the following lifecycle methods apply:<br>
     * 1. DisposableBean's {@code destroy}<br>
     * 2. a custom destroy-method definition
    View Code

      在BeanFactory里只对IOC容器的基本行为作了定义,根本不关心你的bean是如何定义怎样加载的。正如我们只关心工厂里得到什么的产品对象,至于工厂是怎么生产这些对象的,这个基本的接口不关心。

    2.源码

    public interface BeanFactory {
        /**
         * Used to dereference a {@link FactoryBean} instance and distinguish it from
         * beans <i>created</i> by the FactoryBean. For example, if the bean named
         * {@code myJndiObject} is a FactoryBean, getting {@code &myJndiObject}
         * will return the factory, not the instance returned by the factory.
         */
        //使用转义符&来得到FactoryBean本身,用来区分通过容器获得FactoryBean本身和其产生的对象
        String FACTORY_BEAN_PREFIX = "&";
    
        //通过name来获取指定的bean
        Object getBean(String name) throws BeansException;
        
        //根据名字和类型来得到bean实例,增加了类型安全验证机制
        <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    
        //通过类型获取bean实例
        <T> T getBean(Class<T> requiredType) throws BeansException;
    
        //增加更多获取的条件,同上方法
        Object getBean(String name, Object... args) throws BeansException;
    
        <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
    
        //判断容器是否含有指定名字的bean
        boolean containsBean(String name);
    
        //查询指定名字的Bean是不是单例的Bean
        boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    
        //判断Bean是不是prototype类型的bean
        boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    
        //查询指定了名字的Bean的Class类型是否与指定类型匹配
        boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
       
        //获取指定名字bean的Class类型
        Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    
        //查询指定了名字的bean的所有别名,这些别名都是在BeanDefinition中定义的
        String[] getAliases(String name);
    }
    View Code

      BeanFactory接口定义了IOC容器要实现的基本方法。 

    三. BeanFactory 结构体系

      其中BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory 三个子类:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。但是从上图中我们可以发现最终的默认实现类是 DefaultListableBeanFactory,他实现了所有的接口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。例如 ListableBeanFactory 接口表示这些 Bean是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个Bean有可能有父Bean。AutowireCapableBeanFactory 接口定义Bean的自动装配规则。这四个接口共同定义了Bean的集合、Bean之间的关系、以 Bean行为.

    1.AutowireCapableBeanFactory 

    1.1Java doc文档

    /**
     * Extension of the {@link org.springframework.beans.factory.BeanFactory}
     * interface to be implemented by bean factories that are capable of
    autowiring, provided that they want to expose this functionality for
     * existing bean instances.
     *
     * <p>This subinterface of BeanFactory is not meant to be used in normal
     * application code: stick to {@link org.springframework.beans.factory.BeanFactory}
     * or {@link org.springframework.beans.factory.ListableBeanFactory} for
     * typical use cases.
     *
     * <p>Integration code for other frameworks can leverage this interface to
     * wire and populate existing bean instances that Spring does not control
     * the lifecycle of. This is particularly useful for WebWork Actions and
     * Tapestry Page objects, for example.
     *
     * <p>Note that this interface is not implemented by
     * {@link org.springframework.context.ApplicationContext} facades,
     * as it is hardly ever used by application code. That said, it is available
     * from an application context too, accessible through ApplicationContext's
     * {@link org.springframework.context.ApplicationContext#getAutowireCapableBeanFactory()}
     * method.
     *
     * <p>You may also implement the {@link org.springframework.beans.factory.BeanFactoryAware}
     * interface, which exposes the internal BeanFactory even when running in an
     * ApplicationContext, to get access to an AutowireCapableBeanFactory:
     * simply cast the passed-in BeanFactory to AutowireCapableBeanFactory.
    org.springframework.context.ApplicationContext#getAutowireCapableBeanFactory()
     */
    View Code

      这个工厂接口继承自BeanFacotory,它扩展了自动装配的功能,根据类定义BeanDefinition装配Bean、执行前、后处理器等。主要用它来管理ApplicationContext所不能管理的那些Bean,比如Filter,Servlet等。主要通过ApplicationContext的getAutowireCapableBeanFactory()获得实例。

    1.2源码

    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;
    
    
        //-------------------------------------------------------------------------
        // Typical methods for creating and populating external bean instances
        //-------------------------------------------------------------------------
    
        /**
         * Fully create a new bean instance of the given class.
         * <p>Performs full initialization of the bean, including all applicable
         * {@link BeanPostProcessor BeanPostProcessors}.
         * <p>Note: This is intended for creating a fresh instance, populating annotated
         * fields and methods as well as applying all standard bean initialiation callbacks.
         * It does <i>not</> imply traditional by-name or by-type autowiring of properties;
         * use {@link #createBean(Class, int, boolean)} for that purposes.
         * @param beanClass the class of the bean to create
         * @return the new bean instance
         * @throws BeansException if instantiation or wiring failed
         */
        <T> T createBean(Class<T> beanClass) throws BeansException;
    
        /**
         * Populate the given bean instance through applying after-instantiation callbacks
         * and bean property post-processing (e.g. for annotation-driven injection).
         * <p>Note: This is essentially intended for (re-)populating annotated fields and
         * methods, either for new instances or for deserialized instances. It does
         * <i>not</i> imply traditional by-name or by-type autowiring of properties;
         * use {@link #autowireBeanProperties} for that purposes.
         * @param existingBean the existing bean instance
         * @throws BeansException if wiring failed
         */
        void autowireBean(Object existingBean) throws BeansException;
    
        /**
         * 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).
         * <p>This is effectively a superset of what {@link #initializeBean} provides,
         * fully applying the configuration specified by the corresponding bean definition.
         * <b>Note: This method requires a bean definition for the given name!</b>
         * @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;
    
        /**
         * Resolve the specified dependency against the beans defined in this factory.
         * @param descriptor the descriptor for the dependency
         * @param beanName the name of the bean which declares the present dependency
         * @return the resolved object, or {@code null} if none found
         * @throws BeansException in dependency resolution failed
         */
        Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;
    
    
        //-------------------------------------------------------------------------
        // Specialized methods for fine-grained control over the bean lifecycle
        //-------------------------------------------------------------------------
    
        /**
         * Fully create a new bean instance of the given class with the specified
         * autowire strategy. All constants defined in this interface are supported here.
         * <p>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;
    
        /**
         * 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).
         * <p>Does <i>not</i> 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;
    
        /**
         * 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).
         * <p>Does <i>not</i> 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;
    
        /**
         * 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.
         * <p>This method does <i>not</i> autowire bean properties; it just applies
         * explicitly defined property values. Use the {@link #autowireBeanProperties}
         * method to autowire an existing bean instance.
         * <b>Note: This method requires a bean definition for the given name!</b>
         * <p>Does <i>not</i> 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;
    
        /**
         * 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).
         * <p>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})
         * @return the bean instance to use, either the original or a wrapped one
         * @throws BeansException if the initialization failed
         */
        Object initializeBean(Object existingBean, String beanName) throws BeansException;
    
        /**
         * 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 new bean instance
         * @param beanName the name of the bean
         * @return the bean instance to use, either the original or a wrapped one
         * @throws BeansException if any post-processing failed
         * @see BeanPostProcessor#postProcessBeforeInitialization
         */
        Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
                throws BeansException;
    
        /**
         * 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 new bean instance
         * @param beanName the name of the bean
         * @return the bean instance to use, either the original or a wrapped one
         * @throws BeansException if any post-processing failed
         * @see BeanPostProcessor#postProcessAfterInitialization
         */
        Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
                throws BeansException;
    
        /**
         * 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}.
         * <p>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);
    
        /**
         * Resolve the specified dependency against the beans defined in this factory.
         * @param descriptor the descriptor for the dependency
         * @param beanName the name of the bean which declares the present dependency
         * @param autowiredBeanNames a Set that all names of autowired beans (used for
         * resolving the present 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 BeansException in dependency resolution failed
         */
        Object resolveDependency(DependencyDescriptor descriptor, String beanName,
                Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;
    
    }
    View Code

    1.首先几个属性,是装配策略

      AUTOWIRE_BY_NAME:根据名称记性装配。

      AUTOWIRE_BY_TYPE:根据类型进行装配。

      AUTOWIRE_BY_CONSTRUCT:使用构造函数进行装配。

    2.重点关注两类方法

      Typical methods for creating and populating external bean instances。:用于创建和填充外部bean实例的典型方法

      Specialized methods for fine-grained control over the bean lifecycle。专门针对bean生命周期细粒度控制的方法

    2.HierarchicalBeanFactory 

    2.1 JAVA DOC

    package org.springframework.beans.factory;
    
    /**
     * Sub-interface implemented by bean factories that can be part
     * of a hierarchy.
     *
     * <p>The corresponding {@code setParentBeanFactory} method for bean
     * factories that allow setting the parent in a configurable
     * fashion can be found in the ConfigurableBeanFactory interface.
    public interface HierarchicalBeanFactory extends BeanFactory {
        /**
         * Return the parent bean factory, or {@code null} if there is none.
         */
        BeanFactory getParentBeanFactory();
    
        /**
         * Return whether the local bean factory contains a bean of the given name,
         * ignoring beans defined in ancestor contexts.
         * <p>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);
    }
    View Code

    3.ListableBeanFactory 

    3.1JAVA DOC

    /**
     * Extension of the {@link BeanFactory} interface to be implemented by bean factories
     * that can enumerate all their bean instances, rather than attempting bean lookup
     * by name one by one as requested by clients. BeanFactory implementations that
     * preload all their bean definitions (such as XML-based factories) may implement
     * this interface.
     *
     * <p>If this is a {@link HierarchicalBeanFactory}, the return values will <i>not</i>
     * take any BeanFactory hierarchy into account, but will relate only to the beans
     * defined in the current factory. Use the {@link BeanFactoryUtils} helper class
     * to consider beans in ancestor factories too.
     *
     * <p>The methods in this interface will just respect bean definitions of this factory.
     * They will ignore any singleton beans that have been registered by other means like
     * {@link org.springframework.beans.factory.config.ConfigurableBeanFactory}'s
     * {@code registerSingleton} method, with the exception of
     * {@code getBeanNamesOfType} and {@code getBeansOfType} which will check
     * such manually registered singletons too. Of course, BeanFactory's {@code getBean}
     * does allow transparent access to such special beans as well. However, in typical
     * scenarios, all beans will be defined by external bean definitions anyway, so most
     * applications don't need to worry about this differentiation.
     *
     * <p><b>NOTE:</b> With the exception of {@code getBeanDefinitionCount}
     * and {@code containsBeanDefinition}, the methods in this interface
     * are not designed for frequent invocation. Implementations may be slow.
     */
    View Code

    总结一下:

      1.从这个工厂接口开始,可以枚举列出工厂可以生产的所有实例。

      2. 而且如果是一个层次继承的工厂,则只会列出当前工厂的实例,而不会列出祖先层的实例。

    3.2源码

    public interface ListableBeanFactory extends BeanFactory {
        /**
         * Check if this bean factory contains a bean definition with the given name.
         * <p>Does not consider any hierarchy this factory may participate in,
         * and ignores any singleton beans that have been registered by
         * other means than bean definitions.
         * @param beanName the name of the bean to look for
         * @return if this bean factory contains a bean definition with the given name
         * @see #containsBean
         */
        boolean containsBeanDefinition(String beanName);
    
        /**
         * Return the number of beans defined in the factory.
         * <p>Does not consider any hierarchy this factory may participate in,
         * and ignores any singleton beans that have been registered by
         * other means than bean definitions.
         * @return the number of beans defined in the factory
         */
        int getBeanDefinitionCount();
    
        /**
         * Return the names of all beans defined in this factory.
         * <p>Does not consider any hierarchy this factory may participate in,
         * and ignores any singleton beans that have been registered by
         * other means than bean definitions.
         * @return the names of all beans defined in this factory,
         * or an empty array if none defined
         */
        String[] getBeanDefinitionNames();
    
        /**
         * Return the names of beans matching the given type (including subclasses),
         * judging from either bean definitions or the value of {@code getObjectType}
         * in the case of FactoryBeans.
         * <p><b>NOTE: This method introspects top-level beans only.</b> It does <i>not</i>
         * check nested beans which might match the specified type as well.
         * <p>Does consider objects created by FactoryBeans, which means that FactoryBeans
         * will get initialized. If the object created by the FactoryBean doesn't match,
         * the raw FactoryBean itself will be matched against the type.
         * <p>Does not consider any hierarchy this factory may participate in.
         * Use BeanFactoryUtils' {@code beanNamesForTypeIncludingAncestors}
         * to include beans in ancestor factories too.
         * <p>Note: Does <i>not</i> ignore singleton beans that have been registered
         * by other means than bean definitions.
         * <p>This version of {@code getBeanNamesForType} matches all kinds of beans,
         * be it singletons, prototypes, or FactoryBeans. In most implementations, the
         * result will be the same as for {@code getBeanNamesForType(type, true, true)}.
         * <p>Bean names returned by this method should always return bean names <i>in the
         * order of definition</i> in the backend configuration, as far as possible.
         * @param type the class or interface to match, or {@code null} for all bean names
         * @return the names of beans (or objects created by FactoryBeans) matching
         * the given object type (including subclasses), or an empty array if none
         * @since 4.2
         * @see FactoryBean#getObjectType
         * @see BeanFactoryUtils#beanNamesForTypeIncludingAncestors(ListableBeanFactory, ResolvableType)
         */
        String[] getBeanNamesForType(ResolvableType type);
    
        /**
         * Return the names of beans matching the given type (including subclasses),
         * judging from either bean definitions or the value of {@code getObjectType}
         * in the case of FactoryBeans.
         * <p><b>NOTE: This method introspects top-level beans only.</b> It does <i>not</i>
         * check nested beans which might match the specified type as well.
         * <p>Does consider objects created by FactoryBeans, which means that FactoryBeans
         * will get initialized. If the object created by the FactoryBean doesn't match,
         * the raw FactoryBean itself will be matched against the type.
         * <p>Does not consider any hierarchy this factory may participate in.
         * Use BeanFactoryUtils' {@code beanNamesForTypeIncludingAncestors}
         * to include beans in ancestor factories too.
         * <p>Note: Does <i>not</i> ignore singleton beans that have been registered
         * by other means than bean definitions.
         * <p>This version of {@code getBeanNamesForType} matches all kinds of beans,
         * be it singletons, prototypes, or FactoryBeans. In most implementations, the
         * result will be the same as for {@code getBeanNamesForType(type, true, true)}.
         * <p>Bean names returned by this method should always return bean names <i>in the
         * order of definition</i> in the backend configuration, as far as possible.
         * @param type the class or interface to match, or {@code null} for all bean names
         * @return the names of beans (or objects created by FactoryBeans) matching
         * the given object type (including subclasses), or an empty array if none
         * @see FactoryBean#getObjectType
         * @see BeanFactoryUtils#beanNamesForTypeIncludingAncestors(ListableBeanFactory, Class)
         */
        String[] getBeanNamesForType(Class<?> type);
    
        /**
         * Return the names of beans matching the given type (including subclasses),
         * judging from either bean definitions or the value of {@code getObjectType}
         * in the case of FactoryBeans.
         * <p><b>NOTE: This method introspects top-level beans only.</b> It does <i>not</i>
         * check nested beans which might match the specified type as well.
         * <p>Does consider objects created by FactoryBeans if the "allowEagerInit" flag is set,
         * which means that FactoryBeans will get initialized. If the object created by the
         * FactoryBean doesn't match, the raw FactoryBean itself will be matched against the
         * type. If "allowEagerInit" is not set, only raw FactoryBeans will be checked
         * (which doesn't require initialization of each FactoryBean).
         * <p>Does not consider any hierarchy this factory may participate in.
         * Use BeanFactoryUtils' {@code beanNamesForTypeIncludingAncestors}
         * to include beans in ancestor factories too.
         * <p>Note: Does <i>not</i> ignore singleton beans that have been registered
         * by other means than bean definitions.
         * <p>Bean names returned by this method should always return bean names <i>in the
         * order of definition</i> in the backend configuration, as far as possible.
         * @param type the class or interface to match, or {@code null} for all bean names
         * @param includeNonSingletons whether to include prototype or scoped beans too
         * or just singletons (also applies to FactoryBeans)
         * @param allowEagerInit whether to initialize <i>lazy-init singletons</i> and
         * <i>objects created by FactoryBeans</i> (or by factory methods with a
         * "factory-bean" reference) for the type check. Note that FactoryBeans need to be
         * eagerly initialized to determine their type: So be aware that passing in "true"
         * for this flag will initialize FactoryBeans and "factory-bean" references.
         * @return the names of beans (or objects created by FactoryBeans) matching
         * the given object type (including subclasses), or an empty array if none
         * @see FactoryBean#getObjectType
         * @see BeanFactoryUtils#beanNamesForTypeIncludingAncestors(ListableBeanFactory, Class, boolean, boolean)
         */
        String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
    
        /**
         * Return the bean instances that match the given object type (including
         * subclasses), judging from either bean definitions or the value of
         * {@code getObjectType} in the case of FactoryBeans.
         * <p><b>NOTE: This method introspects top-level beans only.</b> It does <i>not</i>
         * check nested beans which might match the specified type as well.
         * <p>Does consider objects created by FactoryBeans, which means that FactoryBeans
         * will get initialized. If the object created by the FactoryBean doesn't match,
         * the raw FactoryBean itself will be matched against the type.
         * <p>Does not consider any hierarchy this factory may participate in.
         * Use BeanFactoryUtils' {@code beansOfTypeIncludingAncestors}
         * to include beans in ancestor factories too.
         * <p>Note: Does <i>not</i> ignore singleton beans that have been registered
         * by other means than bean definitions.
         * <p>This version of getBeansOfType matches all kinds of beans, be it
         * singletons, prototypes, or FactoryBeans. In most implementations, the
         * result will be the same as for {@code getBeansOfType(type, true, true)}.
         * <p>The Map returned by this method should always return bean names and
         * corresponding bean instances <i>in the order of definition</i> in the
         * backend configuration, as far as possible.
         * @param type the class or interface to match, or {@code null} for all concrete beans
         * @return a Map with the matching beans, containing the bean names as
         * keys and the corresponding bean instances as values
         * @throws BeansException if a bean could not be created
         * @since 1.1.2
         * @see FactoryBean#getObjectType
         * @see BeanFactoryUtils#beansOfTypeIncludingAncestors(ListableBeanFactory, Class)
         */
        <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
    
        /**
         * Return the bean instances that match the given object type (including
         * subclasses), judging from either bean definitions or the value of
         * {@code getObjectType} in the case of FactoryBeans.
         * <p><b>NOTE: This method introspects top-level beans only.</b> It does <i>not</i>
         * check nested beans which might match the specified type as well.
         * <p>Does consider objects created by FactoryBeans if the "allowEagerInit" flag is set,
         * which means that FactoryBeans will get initialized. If the object created by the
         * FactoryBean doesn't match, the raw FactoryBean itself will be matched against the
         * type. If "allowEagerInit" is not set, only raw FactoryBeans will be checked
         * (which doesn't require initialization of each FactoryBean).
         * <p>Does not consider any hierarchy this factory may participate in.
         * Use BeanFactoryUtils' {@code beansOfTypeIncludingAncestors}
         * to include beans in ancestor factories too.
         * <p>Note: Does <i>not</i> ignore singleton beans that have been registered
         * by other means than bean definitions.
         * <p>The Map returned by this method should always return bean names and
         * corresponding bean instances <i>in the order of definition</i> in the
         * backend configuration, as far as possible.
         * @param type the class or interface to match, or {@code null} for all concrete beans
         * @param includeNonSingletons whether to include prototype or scoped beans too
         * or just singletons (also applies to FactoryBeans)
         * @param allowEagerInit whether to initialize <i>lazy-init singletons</i> and
         * <i>objects created by FactoryBeans</i> (or by factory methods with a
         * "factory-bean" reference) for the type check. Note that FactoryBeans need to be
         * eagerly initialized to determine their type: So be aware that passing in "true"
         * for this flag will initialize FactoryBeans and "factory-bean" references.
         * @return a Map with the matching beans, containing the bean names as
         * keys and the corresponding bean instances as values
         * @throws BeansException if a bean could not be created
         * @see FactoryBean#getObjectType
         * @see BeanFactoryUtils#beansOfTypeIncludingAncestors(ListableBeanFactory, Class, boolean, boolean)
         */
        <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
                throws BeansException;
    
        /**
         * Find all names of beans whose {@code Class} has the supplied {@link Annotation}
         * type, without creating any bean instances yet.
         * @param annotationType the type of annotation to look for
         * @return the names of all matching beans
         * @since 4.0
         */
        String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
    
        /**
         * Find all beans whose {@code Class} has the supplied {@link Annotation} type,
         * returning a Map of bean names with corresponding bean instances.
         * @param annotationType the type of annotation to look for
         * @return a Map with the matching beans, containing the bean names as
         * keys and the corresponding bean instances as values
         * @throws BeansException if a bean could not be created
         * @since 3.0
         */
        Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
    
        /**
         * Find an {@link Annotation} of {@code annotationType} on the specified
         * bean, traversing its interfaces and super classes if no annotation can be
         * found on the given class itself.
         * @param beanName the name of the bean to look for annotations on
         * @param annotationType the annotation class to look for
         * @return the annotation of the given type if found, or {@code null}
         * @throws NoSuchBeanDefinitionException if there is no bean with the given name
         * @since 3.0
         */
        <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
                throws NoSuchBeanDefinitionException;
    
    }
    View Code
  • 相关阅读:
    how to uninstall devkit
    asp.net中bin目录下的 dll.refresh文件
    查找2个分支的共同父节点
    Three ways to do WCF instance management
    WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
    检查string是否为double
    How to hide TabPage from TabControl
    获取当前系统中的时区
    git svn cygwin_exception
    lodoop打印控制具体解释
  • 原文地址:https://www.cnblogs.com/wxgblogs/p/6659417.html
Copyright © 2011-2022 走看看