Spring中的FactoryBean
Spring 通過反射機制利用<bean>的class屬性指定實現類例項化Bean. 在某些情況下, 例項化Bean的過程比較複雜, 如果按照傳統方式, 需要在<bean>中提供大量的配置資訊. 配置方式的靈活性受限. 這時採用編碼可能會獲得一個簡單的方式.
Spring 提供了一個 org.springframework.beans.factory.FactoryBean 工廠類介面. 使用者可以通過實現該工廠類介面定製例項化Bean的邏輯. Spring提供了70多個FactoryBean的實現類, 它們隱藏了一些複雜例項化Bean的細節, 給上層應用帶來了便利.
T getObject()返回由FactoryBean建立的Bean例項. 如果 isSingleton()返回 true, 則該例項會放到 Spring 容器的單例項快取池中.
Class<?> getObjectType() 返回FactoryBean建立Bean的型別.
當配置檔案中<bean>的class屬性配置的實現類是 FactoryBean時, 通過getBean()方法返回的不是 FactoryBean本身, 而是 FactoryBean#getObject()方法所返回的物件. 相當於 FactoryBean#getObject() 代理了 getBean()方法.
示例程式碼如下:
CatFactoryBean實現了 FactoryBean介面, 自定義了物件的實現.
配置檔案:
測試程式碼:
當呼叫 getBean("cat") 方法時, Spring通過反射機制發現 CatFactoryBean 實現了 FactoryBean的介面. 這時Spring容器呼叫介面方法 CarFactoryBean#getObject() 返回工廠類建立的物件.