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)工廠方法存在一些限制:
- 靜態(tài)工廠方法上不能有參數(shù),也不能在Spring種定義靜態(tài)工廠方法的參數(shù)。
- 靜態(tài)工廠方法只能是public的,不能是private或protected的。
- 靜態(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
修改context.xml:package research.spring.beanfactory.ch2; public class UserDaoFactory{ public UserDao getUserDao(){ return new UserDao("UserDaoFactory"); } }
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)工廠一樣都存在相同的限制:
- 靜態(tài)工廠方法上不能有參數(shù),也不能在Spring種定義靜態(tài)工廠方法的參數(shù)。
- 靜態(tài)工廠方法只能是public的,不能是private或protected的。
- 靜態(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) 編輯 收藏