programmer's home, welcome here!

          technical issues and my life

          常用鏈接

          統(tǒng)計

          最新評論

          Spring內(nèi)核研究-通過工廠注入

          Spring專門設計了對工廠模式支持,你可以使用靜態(tài)工廠方法來創(chuàng)建一個Bean,也可以使用實例工廠的方法來創(chuàng)建Bean。下面分別介紹這2種方法。
          靜態(tài)工廠注入
              定義一個Bean使用自己類上的靜態(tài)工廠方法來創(chuàng)建自己。
          我們繼續(xù)使用上一篇文章《Spring內(nèi)核研究-Lookup方法注入》的例子來說明如何使用靜態(tài)工廠創(chuàng)建Bean。
          context.xml
              factory-menthod定義了userDao Bean使用UserDao類的getInstance方法來創(chuàng)建自己的實例。userManager仍然通過lookup方法獲得userDao。Lookup方法并不關心一個Bean的實例時怎樣創(chuàng)建的,所以可以混合使用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方法來創(chuàng)建自己的實例。
          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使用它自己得靜態(tài)工廠創(chuàng)建得。
           
          靜態(tài)工廠方法存在一些限制:
          1. 靜態(tài)工廠方法上不能有參數(shù),也不能在Spring種定義靜態(tài)工廠方法的參數(shù)。
          2. 靜態(tài)工廠方法只能是public的,不能是private或protected的。
          3. 靜態(tài)工廠方法不能和構造函數(shù)注入一起使用。下面的定義時不能正常工作的:

           

           

          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的工廠對象上的工廠方法來創(chuàng)建自己。
          我們定義一個UserDao的Factory來創(chuàng)建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已經(jīng)使用userDaoFactory實例的工廠方法來創(chuàng)建userDao了。
          • factory-bean定義了工廠Bean
          • factory-method定義了工廠方法
           

           

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

           

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

           

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

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


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 台中县| 泰州市| 兴安县| 阳西县| 东光县| 福安市| 札达县| 会泽县| 博罗县| 江油市| 三门峡市| 淮滨县| 江源县| 乌鲁木齐县| 吉林省| 萨迦县| 乌海市| 三河市| 信阳市| 托克逊县| 大英县| 凤山市| 固阳县| 江永县| 施甸县| 洛浦县| 大丰市| 岑巩县| 丰台区| 延庆县| 岢岚县| 保德县| 东海县| 正镶白旗| 育儿| 江达县| 昭觉县| 清流县| 明光市| 渭源县| 南丹县|