簡介
在Spring框架中,ObjectFactory是一個功能接口,它定義了一個簡單的方法來獲取對象的實例。ObjectFactory接口通常用于工廠模式和依賴注入中,允許延遲對象創建和配置,以及在運行時動態地決定要返回的對象實例。
源碼
@FunctionalInterface
public interface ObjectFactory<T> {/*** 這個接口類似于FactoryBean,但是FactoryBean的實現通常被定義為BeanFactory中的SPI實例,而ObjectFactory的實現通常被定義為作為API(通過注入)提供給其他bean。接口只有一個方法 getObject(),方法沒有參數,像是一個函數式接口;接口定義是一個對象工廠,對象的創建方式完全由調用方或者子類實現。*/T getObject() throws BeansException;/**其實匿名對象也是子類實現一種.
實現類有RequestObjectFactory,ResponseObjectFactory等實現。他們都有個共同的特點,就是通過BeanFactory的registerResolvableDependency()注冊依賴的實例到beanFactory。但是只是聲明依賴關系,并沒有把實例的生命周期交由beanFactory進行管理.*/
void registerResolvableDependency(Class<?> dependencyType, Object autowiredValue);/**即聲明了Class類型依賴的實例是autowiredValue,autowired可以是真實實例,也可以ObjectFactory。這樣,BeanFactory遇到Class類型時就不用再自己創建實例,直接使用autowired注入就行。和普通bean實例的最大區別是beanFactory不維護autowired實例的生命周期,由beanFactory外部維護. 對于ServletRequest實例來說,如果使用tomcat,那么ServletRequest的生命周期就由tomcat維護。
像這種由spring容器外部維護的實例,但容器又想使用依賴注入實現注入,就可以用以上這種方式實現。*/
}
示例
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class ObjectFactoryExample { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); ObjectFactory<MyBean> myBeanObjectFactory = context.getBean("myBeanObjectFactory", ObjectFactory.class); MyBean myBean = myBeanObjectFactory.getObject(); myBean.doSomething(); }
} class MyBean { public void doSomething() { System.out.println("Doing something in MyBean"); }
}
在這個例子中,我們假設在applicationContext.xml配置文件中有一個名為myBeanObjectFactory的FactoryBean定義,它返回MyBean類型的ObjectFactory。然后,我們通過ApplicationContext獲取這個ObjectFactory,并使用它來創建MyBean的實例。
請注意,在實際的Spring應用中,直接使用ObjectFactory的情況并不多見,它更多地是作為內部機制的一部分,用于支持更復雜的Bean生命周期和依賴管理功能。