FactoryBean和BeanFactory都是spring中的接口,從名字上看你們必定以爲這兩個東西有某些聯繫,可是其實這個兩個接口除了名字像以外真的沒啥關係spring
(1)BeanFactory測試
這個接口是spring IOC容器最頂層的接口,你們能夠看一下類圖this
這個接口提供了最基本的容器方法,其餘的容器類都是繼承這個接口來拓展相應的功能的,感興趣的同窗能夠去看看.net
(2)FactoryBeanxml
這個接口是spring提供的用於裝飾用戶bean的接口,這裏採用了裝飾器模式,沒有研究過的同窗能夠看個人另外一篇博文:http://www.javashuo.com/article/p-wsjpurue-mr.html對象
舉個例子blog
實體類:繼承
public class C { private String attr; public String getAttr() { return attr; } public void setAttr(String attr) { this.attr = attr; } }
spring xml配置文件接口
<bean name="c" class="com.chameleon.dao.daoImpl.C"> <property name="attr" value="ceshi"/> </bean>
測試類get
public class MainClient { public static void main(String[] args) { BeanFactory beanFactory = new ClassPathXmlApplicationContext("META-INF/spring/chameleon-context.xml"); C c = (C)beanFactory.getBean("c"); System.out.println(c.getAttr()); } }
結果:ceshi
這就是一個spring依賴注入的簡單的不能再簡單的例子
那如今我有一個想法,就是在獲取這個C的實例的時候通知一下標記一下,或者計數也好,怎麼辦呢?這個時候就能夠使用factorybean裝飾一下了,只須要改一下實體類
public class C implements FactoryBean { private String attr; public String getAttr() { return attr; } public void setAttr(String attr) { this.attr = attr; } public Object getObject() throws Exception { System.out.println("裝飾一下"); C c = new C(); c.setAttr(attr); return c; } public Class<?> getObjectType() { return C.class; } public boolean isSingleton() { return true; } }
在運行一下測試方式
結果爲:
裝飾一下
ceshi
具體的實現就是spring在進行依賴注入的時候會判斷當前的bean 是否是 instanceOf factoryBean 若是屬於的話 會執行getObject方法返回對象實例,具體的細節感興趣的同窗能夠看相應的代碼