首先咱們要知道Spring就是一個大的Bean容器池,用戶經過簡單的配置,讓Spring幫忙實例化對象,而Spring是經過反射原理建立Bean的。java
而後咱們知道通常狀況下咱們配置Bean時使用的是類的全路徑。Spring還提供了另一種方法,經過FactoryBean的方式配置Bean。下面詳細講解FactoryBean。spring
(1)FactoryBean是Spring的一個接口,定義瞭如下3個接口方法:緩存
Object getObject():返回有FactoryBean建立的Bean實例,若是isSingleton()返回true,則該實例會放到Spring容器的單實例緩存池中。
boolean isSingleton():肯定由FactoryBean建立Bean的做用域是singleton仍是prototype。
Class getObjectType():返回FactoryBean建立Bean的類型。ide
(2)當配置文件中 <bean>的class屬性配置的實現類是FactoryBean時,經過getBean方法返回的不是FactoryBean自己,而是 FactoryBean#getObject()方法所返回的對象,至關於FactoryBean#getObject()代理了getBean()方法。this
(3)舉一個簡單的例子,好比當咱們建立某個bean時,須要作一些特殊的事情。代碼以下:prototype
import org.springframework.beans.factory.FactoryBean; public class MyFactoryBean implements FactoryBean { private MyBean instance; private String myFactoryBeanAttr; public String getMyFactoryBeanAttr() { return myFactoryBeanAttr; } public void setMyFactoryBeanAttr(String myFactoryBeanAttr) { this.myFactoryBeanAttr = myFactoryBeanAttr; } @Override public Object getObject() throws Exception { if (instance == null) { instance = createInstance(); } return instance; } public Class getObjectType() { return MyBean.class; } protected MyBean createInstance() throws Exception { // do something return new MyBean(); } public boolean isSingleton() { return true; } private static final class MyBean { } }
這樣當咱們在Spring中註冊MyBeanFactory時實際生成的是MyBean的實例化對象。代理