美文网首页
beanFactory和factoryBean

beanFactory和factoryBean

作者: 帮我的鸵鸟盖个章 | 来源:发表于2020-12-01 12:09 被阅读0次

    beanFactory和factoryBean

    beanFactory

    beanFactorySpring的一个容器,它是一个接口,spring通过实现该接口进行bean的管理。XMLBeanFactoryDefaultListbaleBeanFactoryApplicationContext等都是其实现。

    bean的创建,实例化,初始化,定位,建立对象间的依赖,都是beanFactory的实现。

    factoryBean

    factoryBean本质上也是一个bean,但它是一个特殊的bean,因为通过实现该接口能够定制自己的bean

    源码

    public interface FactoryBean<T> {
        //从工厂中获取bean【这个方法是FactoryBean的核心】
        @Nullable
        T getObject() throws Exception;
        
        //获取Bean工厂创建的对象的类型【注意这个方法主要作用是:该方法返回的类型是在ioc容器中getbean所匹配的类型】
        @Nullable
        Class<?> getObjectType();
        
        //Bean工厂创建的对象是否是单例模式
        default boolean isSingleton() {
            return true;
        }
    }
    

    使用Demo

    public class DogImpl implements FactoryBean {
        @Override
        public Object getObject() throws Exception {
            return new Cat();
        }       
        @Override
        public Class<?> getObjectType() {  //注意这个方法主要作用是:该方法返回的类型是在ioc容器中getbean所匹配的类型
            return Cat.class;
        }
    }
    
    

    getObject()方法会返回实现factoryBean接口的类所产生的对象实例。上栗中,DogImpl类的getObject()方法实际返回的Cat的实例。

    getobjectTYype ()方法仅返回getobject ()方法所返回的对象的类型,如果预先无法确定,则返回null。 特别注意这个方法主要作用是:该方法返回的类型是在ioc容器中getbean所匹配的类型。通过上述的例子都可以看懂。

    isSingleton()返回是否单例。

    factoryBean表现的是一个工厂的职责。 一个Bean A如果实现了FactoryBean接口,那么A就变成了一个工厂,根据A的名称获取到的实际上是工厂调用getObject()返回的对象,而不是A本身,如果要获取工厂A自身的实例,那么需要在名称前面加上'&'符号。

    getObject('beanName')//返回工厂中的实例
    getObject('&beanName') //返回工厂本身的实例
    

    FactoryBean使用场景

    • 创建AOP的代理对象ProxyFactoryBean,LocalSessionFactoryBeanTransactionProxyFactoryBean
    • Mybatis中的SqlSessionFactoryBean
    • Dubbo中的Consumer 也使用到了FactoryBean

    相关文章

      网友评论

          本文标题:beanFactory和factoryBean

          本文链接:https://www.haomeiwen.com/subject/idcjwktx.html