Spring Framework從誕生之日起,受到了越來(lái)越多的關(guān)注。最近,新的開(kāi)源項(xiàng)目大多支持Spring Framework。國(guó)內(nèi)目前也有專(zhuān)門(mén)的網(wǎng)站(http://spring.jactiongroup.net/)。那它為什么如此受歡迎呢?
我想最重要的是,EJB讓每個(gè)人都痛恨。要編寫(xiě)一個(gè)EJB,需要寫(xiě)LocalHome, RemoteHome, Bean, LocalInterface, RemoteInterface,需要一個(gè)標(biāo)準(zhǔn)描述符,一個(gè)特殊廠(chǎng)商描述符(Weblogic、WebSphere都不一樣),如果是Entity Bean,還需要Mapping文件。如此之多,實(shí)在麻煩。但EJB最重要的是解決Transaction問(wèn)題,沒(méi)有Spring之前,沒(méi)有其他方法能夠描述式的解決它。每個(gè)人、每個(gè)公司為了解決Transaction的問(wèn)題,編程的寫(xiě)法都不一樣,百花齊放。于是,在最需要它的時(shí)候,Spring出現(xiàn)了。
Spring的功能非常多。但對(duì)于一個(gè)產(chǎn)品,最重要的是如何用好它的精華。Spring包含AOP、ORM、DAO、Context、Web、MVC幾個(gè)部分組成。Web、MVC暫不用考慮,用成熟的Struts、JSP或Webwork更好。DAO由于目前Hibernate、JDO的流行,也可不考慮。因此最需要用的是AOP、ORM、Context。
Context中,最重要的是Beanfactory,它是將接口與實(shí)現(xiàn)分開(kāi),非常重要。以前我們寫(xiě)程序,如一個(gè)接口IDocument,一個(gè)實(shí)現(xiàn)類(lèi)Document1。在寫(xiě)程序時(shí),需寫(xiě)成IDocument doc = new Document1(),一旦我們的實(shí)現(xiàn)類(lèi)需改變時(shí),變?yōu)镈ocument2,則程序需寫(xiě)成IDocument doc = new Document2(),所有用到的地方全需改。Beanfactory幫我們解決了這個(gè)問(wèn)題,用context后,寫(xiě)法變?yōu)镮Document doc=(IDocument)beanFactory.getBean("doc")。如果實(shí)現(xiàn)類(lèi)從Document1改為Document2,直接在配置文件改就可以了。Context是Bean factory的進(jìn)一步抽象。很多人都喜歡用ApplicationConext,用Servlet把它Load。這樣就把Bean Factory與Web綁定在一起。如果是Fat Client或Remote調(diào)用,則這些Bean factory就很難調(diào)用,實(shí)際是將表現(xiàn)層與業(yè)務(wù)層綁定的太緊。推薦的方法是SingletonBeanFactoryLocator。具體為:
?? BeanFactoryLocator bfLocator = SingletonBeanFactoryLocator.getInstance();
???BeanFactoryReference bf = bfLocator.useBeanFactory("beanFactory");
???// now use some bean from factory
???return bf.getFactory().getBean(name);
?
?<beans>
???? <bean id="beanFactory" class="org.springframework.context.support.ClassPathXmlApplicationContext">
???? <constructor-arg>
????? <list>
?????? <value>dataAccessContext.xml</value>
?????? <value>securityContext.xml</value>
?????? <value>...</value>
????? </list>
???? </constructor-arg>
??? </bean>
</beans>
這樣,就可隨時(shí)動(dòng)態(tài)擴(kuò)展,實(shí)現(xiàn)組件式的開(kāi)發(fā)。
(未完,待續(xù))