美文网首页
Spring ObjectFactory

Spring ObjectFactory

作者: 何德何能者 | 来源:发表于2021-01-04 17:56 被阅读0次

    ObjectFactory<T>

    这个接口类似于FactoryBean,但是FactoryBean的实现通常被定义为BeanFactory中的SPI实例,而ObjectFactory的实现通常被定义为作为API(通过注入)提供给其他bean。
    接口只有一个方法 getObject(),方法没有参数,像是一个函数式接口;

    接口定义是一个对象工厂,对象的创建方式完全由调用方或者子类实现。

    调用方

    AbstractBeanFactory 的getSingleton方法入参,方法需要返回一个单例,单例实例由ObjectFactory提供。 回调AbstractBeanFacoty的自身方法createBean创建单例.

    AbstractBeanFacoty 的自定义scope流程创建对象,方法返回scope自己维护的对象, 对象创建流程在AbstractBeanFacoty已经定义。在匿名ObjectFactotry对象里安排流程触发创建对象。

    总结以上这种方式,在创建对象流程中,一部分流程在调用方自己控制,另一部分流程需要被对用方控制。这时就把调用方的流程封装成ObjectFactory传递给被调用方。组成完整的创建对象流程。

    子类

    其实匿名对象也是子类实现一种.
    实现类有RequestObjectFactory,ResponseObjectFactory等实现。他们都有个共同的特点,就是通过BeanFactory的registerResolvableDependency()注册依赖的实例到beanFactory。但是只是声明依赖关系,并没有把实例的生命周期交由beanFactory进行管理.

         /**
         * Register a special dependency type with corresponding autowired value.
         * <p>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.
         * <p>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, Object autowiredValue);
    

    即声明了Class类型依赖的实例是autowiredValue,autowired可以是真实实例,也可以ObjectFactory。这样,BeanFactory遇到Class类型时就不用再自己创建实例,直接使用autowired注入就行。和普通bean实例的最大区别是beanFactory不维护autowired实例的生命周期,由beanFactory外部维护. 对于ServletRequest实例来说,如果使用tomcat,那么ServletRequest的生命周期就由tomcat维护。
    像这种由spring容器外部维护的实例,但容器又想使用依赖注入实现注入,就可以用以上这种方式实现。
    这时注入的是一个ObjectFactory实例,即真实实例将会被代理。
    既然有这种由外部提供给spring容器使用的bean,那有没有由外部维护,但是又要有自动注入功能的bean呢。
    spring提供了一个工具类, SpringBeanAutowiringSupport. 该工具类支持在web环境下,外部实例的属性在使用@Autowiring时可以自动完成注入。

    与FactoryBean的区别

    从以上两点功能看出的区别,ObjectFactory生成实例对象可部分或完全自主,而FactoryBean完全自主,容器会提供信息,但是不会参与流程。
    ObjectFactory可以实现容器和外部实例的关联关系,ObjectFactory对象实例不受容器管理

    相关文章

      网友评论

          本文标题:Spring ObjectFactory

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