Spring ObjectFactory
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对象实例不受容器管理