zoukankan      html  css  js  c++  java
  • Spring学习笔记——Spring中的BeanFactory与FactoryBean

    BeanFactory
    BeanFactory是Spring的org.springframework.beans.factory下的一个接口,是Spring IOC所遵守的基本编程规范。他的实现类有DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。都各自实现自己的功能。
    FactoryBean
    通常Spring通过反射机制利用bean的class属性来指定实现类的实例化Bean。在某些情况下实例化Bean的过程比較复杂。假设依照传统方式则须要在bean中提供大量的配置信息。而利用Spring提供了一个org.springframework.bean.factory.FactoryBean的工厂接口类。用户能够通过实现该接口定制实例化Bean的逻辑。

    以下是FactoryBean的源码,凝视非常强大。可惜我的英语一般。简单翻译一下。

    /**
     * Interface to be implemented by objects used within a {@link BeanFactory}
     * which are themselves factories. If a bean implements this interface,
     * it is used as a factory for an object to expose, not directly as a bean
     * instance that will be exposed itself.
     *
     * <p><b>NB: A bean that implements this interface cannot be used as a
     * normal bean.</b> A FactoryBean is defined in a bean style, but the
     * object exposed for bean references ({@link #getObject()} is always
     * the object that it creates.
     *
     * <p>FactoryBeans can support singletons and prototypes, and can
     * either create objects lazily on demand or eagerly on startup.
     * The {@link SmartFactoryBean} interface allows for exposing
     * more fine-grained behavioral metadata.
     *
     * <p>This interface is heavily used within the framework itself, for
     * example for the AOP {@link org.springframework.aop.framework.ProxyFactoryBean}
     * or the {@link org.springframework.jndi.JndiObjectFactoryBean}.
     * It can be used for application components as well; however,
     * this is not common outside of infrastructure code.
     *
     * <p><b>NOTE:</b> FactoryBean objects participate in the containing
     * BeanFactory's synchronization of bean creation. There is usually no
     * need for internal synchronization other than for purposes of lazy
     * initialization within the FactoryBean itself (or the like).
     *
     * @author Rod Johnson
     * @author Juergen Hoeller
     * @since 08.03.2003
     * @see org.springframework.beans.factory.BeanFactory
     * @see org.springframework.aop.framework.ProxyFactoryBean
     * @see org.springframework.jndi.JndiObjectFactoryBean
     */
    public interface FactoryBean<T> {
        /**
         * Return an instance (possibly shared or independent) of the object
         * managed by this factory.
         * <p>As with a {@link BeanFactory}, this allows support for both the
         * Singleton and Prototype design pattern.
         * <p>If this FactoryBean is not fully initialized yet at the time of
         * the call (for example because it is involved in a circular reference),
         * throw a corresponding {@link FactoryBeanNotInitializedException}.
         * <p>As of Spring 2.0, FactoryBeans are allowed to return {@code null}
         * objects. The factory will consider this as normal value to be used; it
         * will not throw a FactoryBeanNotInitializedException in this case anymore.
         * FactoryBean implementations are encouraged to throw
         * FactoryBeanNotInitializedException themselves now, as appropriate.
         * @return an instance of the bean (can be {@code null})
         * @throws Exception in case of creation errors
         * @see FactoryBeanNotInitializedException
         */
        // 返回有FactoryBean创建的Bean实例,假设isSingleton为true,则该实例会放到Spring容器中
        T getObject() throws Exception;
        /**
         * Return the type of object that this FactoryBean creates,
         * or {@code null} if not known in advance.
         * <p>This allows one to check for specific types of beans without
         * instantiating objects, for example on autowiring.
         * <p>In the case of implementations that are creating a singleton object,
         * this method should try to avoid singleton creation as far as possible;
         * it should rather estimate the type in advance.
         * For prototypes, returning a meaningful type here is advisable too.
         * <p>This method can be called <i>before</i> this FactoryBean has
         * been fully initialized. It must not rely on state created during
         * initialization; of course, it can still use such state if available.
         * <p><b>NOTE:</b> Autowiring will simply ignore FactoryBeans that return
         * {@code null} here. Therefore it is highly recommended to implement
         * this method properly, using the current state of the FactoryBean.
         * @return the type of object that this FactoryBean creates,
         * or {@code null} if not known at the time of the call
         * @see ListableBeanFactory#getBeansOfType
         */
        // 返回FactoryBean创建Bean类型
        Class<?> getObjectType();
        /**
         * Is the object managed by this factory a singleton? That is,
         * will {@link #getObject()} always return the same object
         * (a reference that can be cached)?

    * <p><b>NOTE:</b> If a FactoryBean indicates to hold a singleton object, * the object returned from {@code getObject()} might get cached * by the owning BeanFactory. Hence, do not return {@code true} * unless the FactoryBean always exposes the same reference. * <p>The singleton status of the FactoryBean itself will generally * be provided by the owning BeanFactory; usually, it has to be * defined as singleton there. * <p><b>NOTE:</b> This method returning {@code false} does not * necessarily indicate that returned objects are independent instances. * An implementation of the extended {@link SmartFactoryBean} interface * may explicitly indicate independent instances through its * {@link SmartFactoryBean#isPrototype()} method. Plain {@link FactoryBean} * implementations which do not implement this extended interface are * simply assumed to always return independent instances if the * {@code isSingleton()} implementation returns {@code false}. * @return whether the exposed object is a singleton * @see #getObject() * @see SmartFactoryBean#isPrototype() */ // 返回由FactoryBean创建的Bean实例的作用域是singleton还是prototype boolean isSingleton(); }

    当配置文件里的class属性配置的实现类是FactoryBean时。通过getBean方法返回的不是FactoryBean本身。而是FactoryBean#getObject()方法返回的对象,相当于FactoryBean#getObject()代理了getBean
    两者差别:
    BeanFactory是一个factory,也就是IOC容器或对象工厂。FactoryBean是个Bean,在Spring中,全部的Bean都是由BeanFactory(IOC)来进行管理的。但对FactoryBean而言,这个Bean是一个生产或者修饰对象生成的工厂Bean,他的实现与设计模式中的工厂模式和修饰器模式相似。

  • 相关阅读:
    用归并排序或树状数组求逆序对数量 poj2299
    UVA10600 次小生成树
    最小生成树求最大比率 UVALive
    求树的重心 poj 1655
    求树的直径+并查集(bfs,dfs都可以)hdu4514
    树形DP+RMQ+尺取法 hdu4123
    区间dp 51nod1021
    LCS poj1080
    最长公共子序列hdu1503
    python No handlers could be found for logger错误的解决
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5195030.html
Copyright © 2011-2022 走看看