JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java Tools  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 第一個Spring程式
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2004-10-21 10:44 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
開始寫寫Spring,這是最簡單的一個入門程式,貼在這邊讓想看看最簡單的Spring程式如何撰寫的人看看,以後相關的文章就直接貼在JavaWorld的Wiki上了。。。。

========================

首先我們要先取得Spring的相關檔案,Spring的檔案放在SourceForge上,網址是:
http://sourceforge.net/project/showfiles.php?group_id=73357

撰寫此文時,Spring最新的版本是1.1.1,有兩個下載版本,一個是spring-framework-1.1.1-with-dependencies.zip,一個是spring-framework-1.1.1.zip,with-dependencies的包括一些ant、jakarta-commons、struts、velocity等等其它開源Java專案的相依檔案,如果您也需要這些相關檔案,可以下載這個版本,如果您已經有這些相關檔案,則只需要下載spring-framework-1.1.1.zip這個檔案。

下載zip檔案並解壓縮之後,在dist目錄下就是使用Spring所需要的相關檔案,如果下載的是with-dependencies版本,則在lib目錄中的是您可能會用到的相依檔案。在dist目錄下,spring-core.jar是Spring的核心,對於撰寫簡單的單機程式來說,使用這個核心即可,如果日後需要使用到Spring其它的子框架支援,再將其它的jar檔案加入即可,例如spring-aop.jar、spring-webmvc.jar等等。您也可以直接使用spring.jar這個檔案,它包括了所有Spring支援的功能所需要的所有類別,而不再需要加入個別的jar檔案。

就我們的第一個Spring程式,只要spring-core.jar這個檔案即可,它唯一相依的其它專案檔案,是commons-logging.jar,您可以在lib目錄的jakarta-commons目錄中找到,將這兩個檔案的位置加入至CLASSPATH中,我們就可以開始撰寫第一個Spring程式。

來撰寫我們的第一個組件(component),它只是一個簡單的JavaBean,用來向新的使用者打招呼:
1
2
3
4
5
6
7
8
9
10
11
12
package onlyfun.caterpillar;
 
public class HelloBean {
    private String helloWord = "Hello!World!";
    
    public void setHelloWord(String helloWord) {
        this.helloWord = helloWord;
    }
    public String getHelloWord() {
        return helloWord;
    }
}


HelloBean有預設的"Hello!World!"字串,我們也可以透過setter來設定新的招呼語,不過我們不親自撰寫程式來作這些事,而是在組態檔案定義,由Spring來為我們作設定的動作,我們撰寫bean.xml:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean">
        <property name="helloWord"><value>Hello!Justin!</value></property>
    </bean>
</beans>


bean.xml中定義了JavaBean的別名與來源類別,<property>標籤中設定了我們希望注入至JavaBean的字串值,bean.xml必須在您的CLASSPATH可以存取到的目錄中,也許是現行的工作目錄,在Web程式中可以是在classes目錄下,我們這邊使用的是單機程式的方式,將使用FileInputStream讀取bean.xml,所以將之置於現行的工作目錄中,接著我們撰寫一個簡單的測試程式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package onlyfun.caterpillar;
 
import java.io.*;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
 
public class SpringTest {
    public static void main(String[] args) throws IOException {
        InputStream is = new FileInputStream("bean.xml");
        BeanFactory factory = new XmlBeanFactory(is);
        
        HelloBean hello = (HelloBean) factory.getBean("helloBean");
        System.out.println(hello.getHelloWord());
    }
}


這是從比較低層次的角度來使用Spring的IoC容器功能,藉由BeanFactory來讀取組態檔案並完成依賴的關聯注入,這邊的依賴是什麼?指的是HelloBean相依於String物件,透過setter所保留的介面,我們使用setter injection來完成這個依賴注入,而不是將招呼語寫死在HelloBean,BeanFactory是整個Spring的重點所在,整個Spring的核心都圍繞著它,在這邊使用的是XmlBeanFactory,負責讀取XML組態檔案,當然我們也可以使用properties檔案,這之後會再介紹。

BeanFactory讀取Bean的組態設定並完成關係維護之後,我們可以藉由getBean()方法並指定Bean的別名來取得實例,來看看實際運行之後的效果:
1
2
3
4
5
2004/10/21 上午 10:28:00 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from resource for InputStream
2004/10/21 上午 10:28:00 org.springframework.beans.factory.support.AbstractBeanFactory getBean
資訊: Creating shared instance of singleton bean 'helloBean'
Hello!Justin!


如果今天您要想改變招呼語,則只要更改bean.xml就可以了,不用修改主要的程式,從比較一般的角度來看,就意味著如果您想要改變一些物件之間的依賴關係,則只要修改組態檔即可,而不用修改組件的任何一行程式。


caterpillar edited on 2004-10-28 13:22
reply to postreply to post
良葛格學習筆記
作者 Re:第一個Spring程式 [Re:caterpillar]
linexpmail

好玩就好



發文: 456
積分: 15
於 2004-10-21 12:29 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
寫的真好。不管是哪種注射方式,一開始很容易搞不清楚是在注射哪種關係,
Spring 在 TSS 簡介就教注射 org.apache.commons.dbcp.BasicDataSource
這種東西進去 DAO,對還不想搞 J2EE 的人來說,實在太複雜了點。

http://www.theserverside.com/articles/article.tss?l=SpringFramework

倒是 PicoContainer 的教法比較自然,你也知道的,就是男生女生之間的
關係嘛。

http://www.picocontainer.org/Two+minute+tutorial


reply to postreply to post
不除妄想不求真
作者 Re:第一個Spring程式 [Re:caterpillar]
ken1106





發文: 1
積分: 0
於 2005-06-21 16:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1.1.2 (14.11.2004)
deprecated constructing an XmlBeanFactory with InputStream, in favor of using Resource which retains location info

以上是 1.1.2 的change log
如果用1.1.2以上的版本可能要將範例改一下


reply to postreply to post
作者 Re:第一個Spring程式 [Re:caterpillar]
ivantang5178





發文: 21
積分: 0
於 2005-09-15 14:58 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請教 各位大大 一個問題
我照著WIKI上的範例 練習將 Hibernate 注入 spring
請問bean.xml 的路徑要放置在哪才是正確位置?
我放在 \WEB-INF\classes 底下 但bean.xml會自動消失 不知原因為何?


reply to postreply to post
月明星稀................
作者 Re:第一個Spring程式 [Re:caterpillar]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2005-09-15 19:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
什麼叫bean.xml自動消失啊?。。:p

放在Classpath下的話,可以試試用ClassPathResource。。。
1
2
      Resource resource = new ClassPathResource(configFile); 
      BeanFactory factory = new XmlBeanFactory(resource);


reply to postreply to post
良葛格學習筆記
作者 Re:第一個Spring程式 [Re:caterpillar]
elviscat





發文: 21
積分: 2
於 2005-09-22 09:46 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ivantang5178 大大說的情形

我也有遇到過,不過我的開發工具是Jbuilder 2005

把bean.xml放在classpath底下,每一次 rebuild的時候,那一個bean.xml就被清掉了,555

另外還有兩個問題:
1.
用XmlBeanFactor的時候
InputStream is = new FileInputStream("bean.xml");
BeanFactory factory = new XmlBeanFactory(is);

Jbuilder 2005告訴我下面的訊息:
"SpringTest2.java": cannot find symbol; symbol : constructor XmlBeanFactory(java.io.InputStream), location: class org.springframework.beans.factory.xml.XmlBeanFactory at line 12, column 31
"SpringTest2.java": internal error; cannot instantiate org.springframework.beans.factory.xml.XmlBeanFactory.<init> at org.springframework.beans.factory.xml.XmlBeanFactory to () at line 12, column 31

我用的是Spring 1.2.4的版本,難道Spring到1.2.4不支援XmlBeanFactory嗎!?!?

2.FileInputStream("bean.xml");
裡面的位置,也是以ClassPath為主的相對位置嗎!?!?

感謝

(縮略圖,點擊圖片鏈接看原圖)


reply to postreply to post
作者 Re:第一個Spring程式 [Re:elviscat]
try





發文: 128
積分: 6
於 2005-09-22 14:05 user profilesend a private message to usersend email to tryreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
elviscat wrote:

另外還有兩個問題:
1.
用XmlBeanFactor的時候
InputStream is = new FileInputStream("bean.xml");
BeanFactory factory = new XmlBeanFactory(is);

.....(略)

我用的是Spring 1.2.4的版本,難道Spring到1.2.4不支援XmlBeanFactory嗎!?!?

2.FileInputStream("bean.xml");
裡面的位置,也是以ClassPath為主的相對位置嗎!?!?


hi,

一、xml放在classpath中是對的,不過你如果不在JBuilder的Project->(右鍵)->properties->path->Build->Resource中將xml的resource切到copy,每一次build時它不會幫你copy,如果你自己copy,它會幫你刪除。

另外Spring的作者Rod Johnson在他的書上早已建議以ApplicationContext取代BeanFactory。所以不用再用BeanFactory了。

二、如果你要將bean.xml放在classpath中的話,應該使用ClassPathXmlApplicationContext這個類別。它還可以一次load很多個xml檔,下面是一個簡單的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BeanLocator // 不喜歡的話請自己取
{
   private final static String[] configFiles =
      {"bean1.xml", "bean2.xml"};
 
   private static ApplicationContext container = new ClassPathXmlApplicationContext(configFiles);
 
  public static Object getBean(String name)
  {
    return container.getBean(name);
  }
....
}


三、如果是Web Application的話,連上面那段code都不用寫,直接在web.xml做設定,並在xml中設好injection,直接inject到你的Web Form(如JSF backing bean或Struts的ActionForm)中即可。如果是用JSF的話,可以在faces-config.xml中直接將spring pojo的inject到JSF 的Backing bean中。

1
2
3
<listener>
    <listener-class>(前面忘了).......ContextLoaderListener</listener-class>
</listener>


try edited on 2005-09-22 14:13
reply to postreply to post
個人網站 - http://cfliao.net/
作者 Re:第一個Spring程式 [Re:caterpillar]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2005-10-16 19:48 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
根據Spring 1.2.5所撰寫的第一個Spring程式如下。。。

=====

首先要取得Spring的相關檔案,Spring的檔案放在 SourceForge

撰寫此文時,Spring最新的版本是1.2.5,有兩個下載版本,一個是spring-framework-1.2.5-with- dependencies.zip,一個是spring-framework-1.2.5.zip,with-dependencies的包括一些 ant、jakarta-commons、struts、velocity等等其它開源Java專案的相依檔案,如果您也需要這些相關檔案,可以下載這個版本,如果您已經有這些相關檔案,則只需要下載spring-framework-1.2.5.zip這個檔案。

下載zip檔案並解壓縮之後,在dist目錄下就是使用Spring所需要的相關檔案,如果下載的是with-dependencies版本,則在lib 目錄中的是您可能會用到的相依檔案。在dist目錄下,spring-core.jar是Spring的核心,如果日後需要使用到Spring其它的子框架支援,再將其它的jar檔案加入即可,例如spring-aop.jar、spring-webmvc.jar等等。您也可以直接使用 spring.jar這個檔案,它包括了所有Spring支援的功能所需要的所有類別,而不再需要加入個別的jar檔案。

注意在Spring 1.2之後,原先於spring-core.jar中與Bean相關的一些套件,現在已移至spring-beans.jar中。

就這邊接下來要練習的第一個Spring程式,要將spring-core.jar、spring-beans.jar,以及相依的commons- logging.jar加至Classpath的路徑中,您可以在lib目錄的jakarta-commons目錄中找到。

來撰寫您的第一個組件(Component),它只是一個簡單的JavaBean,用來向使用者打聲招呼:
1
2
3
4
5
6
7
8
9
10
11
12
package onlyfun.caterpillar; 
 
public class HelloBean { 
    private String helloWord; 
    
    public void setHelloWord(String helloWord) { 
        this.helloWord = helloWord; 
    } 
    public String getHelloWord() { 
        return helloWord; 
    } 
}


稍後您可以透過setHelloWord()這個Setter來設定新的招呼語,不過並不是親自撰寫程式來作這些事,而是在組態檔案定義,由Spring 來為您作設定的動作,接著可以撰寫Bean的定義檔案,定義檔案會告訴Spring容器,如何完成相依物件的關係注入等動作,Bean定義檔的名稱可以自由定義,例如這邊取名為beans-config.xml:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
  "http://www.springframework.org/dtd/spring-beans.dtd"> 
 
<beans> 
    <bean id="helloBean" 
          class="onlyfun.caterpillar.HelloBean"> 
        <property name="helloWord">
            <value>Hello!Justin!</value>
        </property> 
    </bean> 
</beans>


定義檔中定義了JavaBean的別名與來源類別,<property>標籤中設定了希望注入至JavaBean的字串值,撰寫一個簡單的示範程式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package onlyfun.caterpillar; 
 
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.beans.factory.BeanFactory; 
import org.springframework.beans.factory.xml.XmlBeanFactory; 
 
public class SpringDemo { 
    public static void main(String[] args) { 
        Resource rs = 
            new FileSystemResource("beans-config.xml"); 
        BeanFactory factory = 
            new XmlBeanFactory(rs); 
        
        HelloBean hello = 
            (HelloBean) factory.getBean("helloBean"); 
        System.out.println(hello.getHelloWord()); 
    } 
}


BeanFactory是 Factory 模式 的一個實作例子,但用途更為一般,可以建立、管理不同型態的物件,由於這邊所使用的Bean定義檔是XML,所以使用實作BeanFactory介面的 XmlBeanFactory來作為管理Bean的實際物件,在Spring 1.2中,XmlBeanFactory只接受實作Resource介面的物件,像是ClassPathResource、 FileSystemResource、InputStreamResource、ServletContextResource、 UrlResource等,分別表示不同的檔案來源物件,這邊所使用的是FileSystemResource,表示指定相對路徑或絕對路徑來取得 Bean定義檔, 同樣的,如果您的Bean定義檔是位於Classpath路徑中,您也可以使用ClasspPathResource來取得定義檔。

這是從比較低層次的角度來使用Spring的IoC容器功能,藉由BeanFactory來讀取組態檔案並完成依賴的關聯注入,這邊的依賴是什麼?指的是 HelloBean相依於String物件,透過Setter所保留的介面,使用Setter injection來完成這個依賴注入,而不是將招呼語寫死在HelloBean,BeanFactory是整個Spring的重點所在,整個 Spring的核心都圍繞著它,在這邊使用的是XmlBeanFactory,負責讀取XML組態檔案,您也可以使用properties檔案,這之後會再介紹。

BeanFactory讀取Bean的組態設定並完成關係維護之後,可以藉由getBean()方法並指定Bean的別名來取得Bean實例,如果使用 BeanFactory的話,只有在真正需要Bean物件時,才會實際建立Bean實例,而不是在一開始建立BeanFactory時就建立Bean實例,來看看實際運行之後的效果:
1
2
3
2005/10/16 下午 07:14:03 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from file [C:\workspace\SpringDemo\beans-config.xml]
Hello!Justin!


如果今天您要想改變招呼語,則只要更改bean.xml就可以了,不用修改主要的程式,從比較一般的角度來看,就意味著如果您想要改變一些物件之間的依賴關係,則只要修改組態檔即可,而不用修改組件的任何一行程式。


caterpillar edited on 2013-03-24 15:41
reply to postreply to post
良葛格學習筆記
作者 Re:第一個Spring程式 [Re:caterpillar]
elviscat





發文: 21
積分: 2
於 2005-10-18 09:05 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝
Try & 良葛格的指導,已經設定完成嚕!!

Tongue


reply to postreply to post
努力學Java中唷!! :)
作者 Re:第一個Spring程式 [Re:caterpillar]
yeafee





發文: 4
積分: 0
於 2005-10-19 17:32 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
F:\liang\onlyfun.caterpillar.*.class
|+HelloBean.java
|+SpringDemo.java
|+Beans-Config.xml

2005-10-19 17:19:24 org.springframework.beans.factory.xml.XmlBeanDefinitionReade
r loadBeanDefinitions
信息: Loading XML bean definitions from file [F:\liang\beans-config.xml]
Hello!Justin!
Press any key to continue...


reply to postreply to post
三人行,必有我师焉
学而时习之,学而不思则罔
www.matrix.org.cn
www.cjsdn.net
www.javaworld.com.tw
作者 Re:第一個Spring程式 [Re:caterpillar]
greenapple1981





發文: 4
積分: 0
於 2006-11-15 13:44 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
大陆同胞在这里感谢您!

reply to postreply to post
» JWorld@TW »  Java Tools

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8