programmer's home, welcome here!

          technical issues and my life

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

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

          Spring專門設(shè)計(jì)了對(duì)工廠模式支持,你可以使用靜態(tài)工廠方法來(lái)創(chuàng)建一個(gè)Bean,也可以使用實(shí)例工廠的方法來(lái)創(chuàng)建Bean。下面分別介紹這2種方法。
          靜態(tài)工廠注入
              定義一個(gè)Bean使用自己類上的靜態(tài)工廠方法來(lái)創(chuàng)建自己。
          我們繼續(xù)使用上一篇文章《Spring內(nèi)核研究-Lookup方法注入》的例子來(lái)說(shuō)明如何使用靜態(tài)工廠創(chuàng)建Bean。
          context.xml
              factory-menthod定義了userDao Bean使用UserDao類的getInstance方法來(lái)創(chuàng)建自己的實(shí)例。userManager仍然通過(guò)lookup方法獲得userDao。Lookup方法并不關(guān)心一個(gè)Bean的實(shí)例時(shí)怎樣創(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
              增加一個(gè)getInstance方法來(lái)創(chuàng)建自己的實(shí)例。
          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(); } }

          運(yùn)行Test.java,你會(huì)看到:

          create user from - static factory method

          這說(shuō)明userDao使用它自己得靜態(tài)工廠創(chuàng)建得。
           
          靜態(tài)工廠方法存在一些限制:
          1. 靜態(tài)工廠方法上不能有參數(shù),也不能在Spring種定義靜態(tài)工廠方法的參數(shù)。
          2. 靜態(tài)工廠方法只能是public的,不能是private或protected的。
          3. 靜態(tài)工廠方法不能和構(gòu)造函數(shù)注入一起使用。下面的定義時(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(); } }
          實(shí)例工廠注入
              定義一個(gè)Bean使用這個(gè)Bean的工廠對(duì)象上的工廠方法來(lái)創(chuàng)建自己。
          我們定義一個(gè)UserDao的Factory來(lái)創(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>

          再次運(yùn)行Test.java你會(huì)看到:
          create user from – UserDaoFactory
           
              通過(guò)上面的配置Spring已經(jīng)使用userDaoFactory實(shí)例的工廠方法來(lái)創(chuàng)建userDao了。
          • factory-bean定義了工廠Bean
          • factory-method定義了工廠方法
           

           

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

           

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

           

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

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 杨浦区| 新竹县| 上高县| 永胜县| 西丰县| 高安市| 大化| 武平县| 格尔木市| 长岛县| 华池县| 汤原县| 建阳市| 兴仁县| 安塞县| 马边| 伽师县| 东丰县| 安阳市| 正定县| 东乡族自治县| 纳雍县| 吴川市| 兰西县| 开江县| 小金县| 武鸣县| 唐山市| 来凤县| 呼伦贝尔市| 右玉县| 棋牌| 浦县| 丘北县| 山阳县| 富蕴县| 怀仁县| 天台县| 和静县| 丹凤县| 乃东县|