beanFactory 和factoryBean的區別

共同點:都是接口 
Spring中共有兩種bean,一種爲普通bean利用beanFactory來創建管理,另一種則爲工廠bean。利用factoryBean來管理
(定製化的bean,複雜的bean)
區別:
  •  BeanFactory

      以factory結尾,表示它是一個工廠類,用於管理Bean的一個工廠。 在Spring中,所有的Bean都是由BeanFactory(也就是ioc容器進行管理)定義了ioc容器的最基本形式,並提供了ioc容器應遵守最基本的接口,也就是spring ioc 所遵守 最底層和最基本的規範,他負責,實列化,定位,配置應用程序中的對象及建立這些對象間的依賴。在spring中, beanfactry只是一個接口,並不是ioc容器的具體實現。 但是Spring容器給出了很多種實現, 如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,都是附加了某種功能的實現。

  •  FactoryBean

    但對FactoryBean而言, 這個bean不是簡單的bean,而是一個能生產或者修飾對象的生成的工廠Bean.一般情況下,Spring通過反射機制利用<bean>的class屬性指定實現類實例化Bean, 用戶可以通過實現該接口定製實例化Bean的邏輯。actoryBean接口對於Spring框架來說佔用重要的地位, Spring自身就提供了70多個FactoryBean的實現。它們隱藏了實例化一些複雜Bean的細節,給上層應用帶來了便利。 從Spring3.0開始,FactoryBean開始支持泛型,即接口聲明改爲FactoryBean<T>的形式

在該接口中還定義了以下3個方法:
  • T getObject():
      返回由FactoryBean創建的Bean實例,如果isSingleton()返回true,
    則該實例會放到Spring容器中單實例緩存池中;
  • boolean isSingleton(): 
      返回由FactoryBean創建的Bean實例的作用域是
    singleton還是prototype;true是單列
  • Class<T> getObjectType():
      返回FactoryBean創建的Bean類型。
      當配置文件中<bean>的class屬性配置的實現類是FactoryBean時,通過getBean()方法返回的不是FactoryBean本身,
    而是FactoryBean#getObject()方法所返回的對象,相當於FactoryBean#getObject()代理了getBean()方法。
    當調用getBean("jamesFactoryBean")時,Spring通過反射機制發現CarFactoryBean實現了FactoryBean的接口,
    這時Spring容器就調用接口方法CarFactoryBean#getObject()方法返回。
    如果希望獲取CarFactoryBean的實例,則需要在使用getBean(beanName)
    方法時在beanName前顯示的加上"&"前綴:如getBean("&car");
    Object bean1 = app.getBean("&jamesFactoryBean");//È¡JamesFactoryBean
    Object bean2 = app.getBean("jamesFactoryBean");//È¡Money
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章