壹般情況下,Spring 通過反射機制利用bean 的 class屬性指定實現類來實例化bean。在某些情況下,實例化 bean 的過程不叫復雜,如果按照傳統的方式,則需要在 <bean> 中提供大量的配置信息,配置的靈活度受限,這時候采用編碼的方式可能會得到壹個簡單的方法。Spring提供了壹個 org.springframework.bean.FactoryBean的工廠接口 ,用戶可以通過實現該接口定制實例化的bean。
FactoryBean接口對於Spring框架來說占用重要的地位,Spring本身就提供了特別多的FactoryBean的實現。它們隱藏了實例化復雜bean的細節,給上層應用帶來了便利。FactoryBean的源碼如下:
在該接口中定義了三個方法:
當配置文件中 <bean> 的class屬性配置實現的是FactoryBean時,通過getBean()方法返回的不是 FactoryBean 本身,而是 FactoryBean 的 getObject() 方法返回的對象。
例如使用傳統的方式配置下面的Student的 <bean> 的時,Student的每壹個屬性都會對應壹個 <property> 元素的標簽。
如果使用FactoryBean的方式實現就更靈活壹些,通過下面的逗號分隔符的方式壹次性地為Student的所有屬性指定配置值:
有了這壹個StudentFactoryBean後,就可以在配置文件中使用下面的這種方法配置StudentBean了。
當調用 getBean("student") 時,Spring通過反射機制發現 StudentFactoryBean#getObject() 方法的返回。 如果希望獲取 StudentFactoryBean 的實例,則需要使用 getBean(beanName) 方法時在beanName前顯示的加上 "&" 前綴,例如 getBean("&student") 。