close

需要上課的人員:

  • 不瞭解新生成的JAVA如何被Spring呼叫到的人。

Spring與web.xml

我們有很多的class的初始化是是透過Sping,Spring讀取特定的設定檔後,幫我們將特定的JAVA讀進來它的Map由,而程式中要使用的時候,就可以透過Spring來呼叫;可是,是誰幫Spring做初始化呢?答案當然是web.xml;不要忘記,web.xml是一個網站中的基礎。

我們來看在web.xml中的Spring初始化設定:

  1. 先設定Spring的listener

  1. 設定context-param

根據這些設定,Spring才能被初始化,並讀取相應的XML檔案。

Spring與XML設定檔

Spring可以幫我們初始化了一些Class,我們如果要請Spring初始化這些Class,一定得利用XML,而利用XML初始化Class的方式有二種,我們分別來討論。

bean

第一種方式是利用bean的標籤來宣告,例如:

下方是一種sessionFactory的宣告,它的Class是org.springframework.orm.hibernate4.LocalSessionFactoryBean,而它被儲存在Spring中的key是readSessionFactory,所以在JAVA中就可以用readSessionFactory的變數來使用,如下圖:

Auto scan

第二種方式是利用Auto scan的方式,如下圖:

利用context:component-scan的方式,它會自動尋找base-package對應的package參數,並掃瞄找到所有的JAVA,如果JAVA中有 @Component、@Controller、@Service、@Repository 這些宣告,則會自動被抓取到Spring中的Map中,並將它的key設定為Class的名稱,不過頭文字是小寫的。

JAVA與Annotation(@)

@Component、@Controller、@Service、@Repository

如果這個Class是用bean的方式宣告的,那它可以不用使用@宣告;但是如果這個Class是要利用Auto scan的方式來被掃瞄的,那麼這個Class就需要使用@來進行宣告,宣告的型別有四種,分別是 @Component、@Controller、@Service、@Repository 這四種,但這個部份只是一個說明,並不會影響我們直接利用key的方式來存取Spring中的Map。

@Autowird

上方@Component、@Controller、@Service、@Repository四種都是將Class變成Value後,儲存進Spring中的Map,至於該怎麼取出來,除了利用XML中bean的property屬性外,最快的方式是透過@Autowird,如下圖:

以上圖為例,在初始這個Class時,會自動到Spring的Map中,找到key為uploadService的東西,並將值指定uploadService的這個變數。

@Resource

@Resource跟@Autowird很像,不過@Resource必須搭配一個屬性name,如下圖:

@Resource跟@Autowird一樣會自動從Spring找到對應的值並指定,不過@Autowird無法指定Spring Map中的key值,所以如果要指定Spring中的key值,需要使用@Resource。

Spring中常遇到的問題與解決方法

在XML中設定完Spring後,啟動時最常遇到的問題分別是ClassNotFoundException與NoSuchMethodException,我們分別來討論。

ClassNotFoundException

通常遇到這個問題的原因,是因為JVM找不到對應的class檔案,而WEB專案的class檔分別會被放在二個地方,一個是WEB-INF/classes底下,裡面是由我們自己寫的編譯過的class檔,一個是放在WEB-INF/lib底下,放的是3rd party寫的JAR檔,請根據console輸出的log,判斷是那一邊出問題,是自己寫的程式沒有被編譯成功,還是根本就沒有放相應的JAR檔。

NoSuchMethodException

如果是遇到這種問題,通常是JAR檔已經放在WEB-INF/lib底下,不過JAR檔之間的版本不符,導至在執行時,被呼叫的class檔並無此Method;遇到這個問題,就只能上網求救了,找到相關的資訊,並更新JAR檔試看看。

arrow
arrow

    JAVA Programmer 發表在 痞客邦 留言(1) 人氣()