programmer's home, welcome here!

          technical issues and my life

          常用鏈接

          統計

          最新評論

          Spring內核研究-通過工廠注入

          Spring專門設計了對工廠模式支持,你可以使用靜態工廠方法來創建一個Bean,也可以使用實例工廠的方法來創建Bean。下面分別介紹這2種方法。
          靜態工廠注入
              定義一個Bean使用自己類上的靜態工廠方法來創建自己。
          我們繼續使用上一篇文章《Spring內核研究-Lookup方法注入》的例子來說明如何使用靜態工廠創建Bean。
          context.xml
              factory-menthod定義了userDao Bean使用UserDao類的getInstance方法來創建自己的實例。userManager仍然通過lookup方法獲得userDao。Lookup方法并不關心一個Bean的實例時怎樣創建的,所以可以混合使用lookup方法和factory-menthod方法。
          xml version="1.0" encoding="UTF-8"?> DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="userManager" class="research.spring.beanfactory.ch2.UserManager"> <lookup-method name="getUserDao" bean="userDao" /> bean> <bean name="userDao" class="research.spring.beanfactory.ch2.UserDao"
           factory-method="getInstance" / > beans>

          UserDao.java
              增加一個getInstance方法來創建自己的實例。
          package research.spring.beanfactory.ch2; public class UserDao { public static UserDao getInstance() { return new UserDao("static factory method"); } private String name = ""; public UserDao(String name) { this.name = name; } public void create() { System.out.println("create user from - " + name); } }

          Test.java
          package research.spring.beanfactory.ch2;
          import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource;
          public class Test { public static void main(String[] args) { XmlBeanFactory factory=new XmlBeanFactory(new ClassPathResource(
          "research/spring/beanfactory/ch2/context.xml")); UserManager manager=(UserManager) factory.getBean("userManager"); manager.createUser(); } }

          運行Test.java,你會看到:

          create user from - static factory method

          這說明userDao使用它自己得靜態工廠創建得。
           
          靜態工廠方法存在一些限制:
          1. 靜態工廠方法上不能有參數,也不能在Spring種定義靜態工廠方法的參數。
          2. 靜態工廠方法只能是public的,不能是private或protected的。
          3. 靜態工廠方法不能和構造函數注入一起使用。下面的定義時不能正常工作的:

           

           

          package research.spring.beanfactory.ch2; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Test { public static void main(String[] args) { XmlBeanFactory factory=new XmlBeanFactory(new ClassPathResource(
          "research/spring/beanfactory/ch2/context.xml")); UserManager manager=(UserManager) factory.getBean("userManager"); manager.createUser(); } }
          實例工廠注入
              定義一個Bean使用這個Bean的工廠對象上的工廠方法來創建自己。
          我們定義一個UserDao的Factory來創建UserDao。
          UserDaoFactory.java
          package research.spring.beanfactory.ch2; public class UserDaoFactory{ public UserDao getUserDao(){ return new UserDao("UserDaoFactory"); } }
          修改context.xml:
          xml version="1.0" encoding="UTF-8"?> DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="userManager" class="research.spring.beanfactory.ch2.UserManager"> <lookup-method name="getUserDao" bean="userDao" /> bean> <bean name="userDao" class="research.spring.beanfactory.ch2.UserDao"
           factory-bean
          ="userDaoFactory" factory-method="getUserDao" > bean> <bean name="userDaoFactory" class="research.spring.beanfactory.ch2.UserDaoFactory"> bean> beans>

          再次運行Test.java你會看到:
          create user from – UserDaoFactory
           
              通過上面的配置Spring已經使用userDaoFactory實例的工廠方法來創建userDao了。
          • factory-bean定義了工廠Bean
          • factory-method定義了工廠方法
           

           

              實例工廠和靜態工廠一樣都存在相同的限制:
          1. 靜態工廠方法上不能有參數,也不能在Spring種定義靜態工廠方法的參數。
          2. 靜態工廠方法只能是public的,不能是private或protected的。
          3. 靜態工廠方法不能和構造函數注入一起使用。

           

             
              和靜態工廠不同的是:
          •  實例工廠方法不能是靜態的,而靜態工廠方法必須是靜態的。

           

              通過上面的例子我們看到Spring對工廠模式對了完整的支持。但是這里還是需要說明,如果使用IoC模式設計的系統一般情況下不需要為任何Bean做工廠類。在我的觀點里,工廠模式僅僅是遺留系統,使用依賴注入模式可以取代工廠模式。Spring對工廠的支持僅僅是為了可以很好的集成遺留系統。

          posted on 2007-04-09 02:59 crazy zerlot 閱讀(955) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 利辛县| 微博| 五寨县| 故城县| 巴林左旗| 河南省| 茂名市| 正宁县| 包头市| 甘南县| 子长县| 沾化县| 左权县| 富平县| 湘潭市| 淮安市| 行唐县| 青海省| 屯昌县| 栖霞市| 收藏| 新田县| 襄垣县| 陕西省| 西盟| 怀化市| 铜川市| 曲松县| 察哈| 武清区| 高淳县| 焦作市| 淮滨县| 文山县| 黄梅县| 上蔡县| 和平区| 新源县| 宜君县| 云阳县| 福贡县|